Introducción La finalidad de esta guía es adentrar al usuario en las técnicas de SQL INJECTION. Para esta labor se va a emplear una máquina metasploitable2 creada por los desarrolladores de Rapid7, y está en descarga libre. En la parte del ataque emplearemos una máquina Windows 10 con el navegador Mozilla Firefox en la versión 51.0.1 y la extensión @H3LL4R_H5H HackMOD para la parte de la inyección del headers http/https. En los headers viaja la información hacia la base de datos en forma de órdenes y peticiones, de tal modo que, si conseguimos encontrar vulnerabilidades en las implementaciones de las bases de datos, podremos modificar los parámetros que indican que información debe mostrar o escribir en las mismas. Voy a hacer un inciso para explicar que DVWA está libre para su descarga e implementación, pero he optado por metasploitable2 dado que ya está todo preparado para poder empezar a trabajar con DVWA. DVWA tiene 4 niveles de seguridad en lo que SQL INJECTION se refiere; low, medium y high este humilde servidor, tras muchas horas de búsquedas e investigaciones para poder entender más sobre la técnica injection, solo ha podido conseguir cosas en los 3 primero niveles, por esto, el nivel high lo obviaré por el momento, aunque daré algunas explicaciones al respecto.
Acceso a la máquina DVWA Para obtener acceso a la máquina vulnerable debemos obtener la dirección IP de metasploitable2 en este caso, puesto que es la máquina que contiene esta aplicación vulnerable, para ello podemos lanzar un nmap a nuestra red, y veremos que habrá un host que posee una gran cantidad de puertos abiertos, esa será nuestra IP. Una vez que entremos en esa dirección IP debemos seleccionar DVWA, pasaremos a un panel que nos solocita usuario y contraseña (admin y password), esto puede ser explotado mediante hydra y un diccionario, usando combinaciones de las contraseñas por defecto más usadas, …, etc.
USERNAME ==> admin
PASSWORD ==> password
Lo primero que vamos a hacer es seleccionar en DVWA Security el nivel low para empezar por lo más sencillo.
Cuando lo tengamos el low y hayamos clicado sobre submit, nos dirigiremos a SQL Injection para poder empezar a buscar vulnerabilidades.
En la sección SQL Injection nos encontraremos con esto.
Bien en este punto vamos a comentar que, por lo normal, las bases de datos tienen un número de identificación único, que por lo normal suele ser incrementable, no reemplazable de manera automática, y llamable desde una base de datos para ver todos los campos de la tabla referentes a ese objeto. Esta pantalla simplemente es una petición mediante PHP a mostrar todos los campos que posee la tabla sobe el objeto con un ID determinado, empezaremos con el 1 para ver que campos posee la tabla.
Como podemos observar, la tabla posee los campos ID, First name y Surname
Bien ahora que ya sabemos algo sobre las tablas, y en concreto sobre la tabla a la que vamos a hacer SQL INJECTION, podemos empezar a inyectarla parámetros. Para ello vamos a clicar sobre load url en la extensión que se comentaba en la introducción para poder ver la petición que le hemos mandado a la base de datos para ver los datos del ID 1.
Vamos a empezar a trabajar sobre esta petición para obtener algunos datos. Lo primero es modificar el número después de la cadena ?id=1 para poder ver si obtenemos respuesta válida. En este caso la pondremos un 2 en lugar de un 1 dado que es muy probable que haya otro objeto o ID dentro de la tabla.
Como vemos esto nos da una respuesta satisfactoria lanzándonos los datos del objeto con el ID 2.
////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a intentar saber cuántas columnas tiene la tabla, está claro que hay tablas que son de tamaños gigantescos, y en este punto la paciencia y la suerte son un factor importante tanto para evitar nuestra desesperación, como nuestras ganas de seguir con la inyección. Como hemos podido ver antes, al introducir un número válido dentro del campo User ID, la base de datos nos devuelve 2(campos (columnas)). Esto es una información importante, pero en absoluto significa que hayamos encontrado la respuesta correcta en lo que se refiere al número total de columnas que posee la tabla. Esto es debido a que la interfaz web, puede que solo este mostrando algunas columnas de la tabla, pero no todas, lo que sí es seguro es que menos de 2 columnas es imposible que haya. En caso de que genere error el número introducido para la búsqueda, significa que el número de columnas es menor, en el caso de que no genere error el número especificado en la búsqueda es que la información es correcta o mayor, por esto debemos empezar recomendablemente por un número algo alto e ir decrementándolo.
Tenemos error, esto significa que debemos buscar un número más bajo de columnas
Tenemos otro error, así que vamos a probar un número más bajo, como sabemos en este caso que va a ser 2, lo tenemos fácil, pero la técnica es ir bajando de 1 en 1 el número de intentos.
Cómo vemos la inyección de order by 2 nos devuelve información, y en este caso sí que si nos devuelve todas las columnas que posee la tabla para ese ID, y por ende para el resto de ID’s
////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a ver otra manera de realizar dos peticiones a la base de datos en una sola llamada, para ello seleccionaremos UNION BASED --> UNION ESTATMENT --> INT
Cómo os podréis imaginar en esta prueba de 10 columnas, la llamada a select está en otro número diferente de columna, ¿Os imagináis cuál es? ... .
El número que buscábamos era el 2, y como vemos, nos devuelve la información de las columnas con el número correlativo que ocupan en la tabla. ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a buscar algo de información sobre la máquina que aloja el servidor web y SQL, para ello vamos a preguntar a la base de datos sobre el usuario, donde se aloja la base de datos y la versión de esta. Para ello UNION BASED --> BASIC STATMENTS -->
USER(),DATABASE(),VERSION. Borraremos algunas cosas como vemos en la captura del inyectador.
Y obtendremos esta salida:
////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////
Ahora vamos a ver en todas las tablas que posee la base de datos, esto lo haremos concatenando los parámetros table_name de la tabla de esquema de información donde el esquema de información será la base de datos… .
Cómo el código del inyectador puede que no se vea bien esta es la inyección que se le aplica a la base de datos: http://192.168.1.131/dvwa/vulnerabilities/sqli/?id=2' +UNION+ALL+SELECT+CONCAT(table_name),2 from information_schema.tables where table_schema=database() -- -&Submit=Submit#
Y obtenemos esta salida:
////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a ver todas las columnas dentro de la tabla users dado que a primera impresión parece la más indicada para obtener los datos que necesitamos.
Cómo el código del inyectador puede que no se vea bien esta es la inyección que se le aplica a la base de datos: http://192.168.1.131/dvwa/vulnerabilities/sqli/?id=2' +UNION+ALL+SELECT+group_concat(column_name),2 from information_schema.columns where table_name='users' -- -&Submit=Submit# Y obtenemos esta salida:
////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////
Ahora vamos a sacar los usuarios y las contraseñas de los ID’s alojados en la base de datos. Para ello le pediremos a la base de datos que nos muestre esas columnas de la tabla users.
Cómo el código del inyectador puede que no se vea bien esta es la inyección que se le aplica a la base de datos: http://192.168.1.131/dvwa/vulnerabilities/sqli/?id=2' +UNION+ALL+SELECT+group_concat(user,'==',password),2 from users -- -&Submit=Submit# Y obtenemos una salida como esta:
Esta es toda la secuencia de usuarios y contraseñas: admin==5f4dcc3b5aa765d61d8327deb882cf99,gordonb==e99a18c428cb38d5f2608 53678922e03,1337==8d3533d75ae2c3966d7e0d4fcc69216b,pablo==0d107d09f5bb e40cade3de5c71e9e9b7,smithy==5f4dcc3b5aa765d61d8327deb882cf99
Cómo se aprecia perfectamente, las contraseñas están encriptadas, presumiblemente por md5, ahora deberíamos lanzar un algoritmo para romper las contraseñas mediante tablas rainbow o mediante algún sitio web que permite comprobar si alguno de estos hash está descifrado en sus bases de datos.
Lo primero que vamos a hacer es seleccionar en DVWA Security el nivel medium para empezar por lo más sencillo.
Cuando lo tengamos el medium y hayamos clicado sobre submit, nos dirigiremos a SQL Injection para poder empezar a buscar vulnerabilidades.
Cuando tengamos la seguridad de la máquina DVWA en el nivel medium, veremos, que los ataques realizados en el nivel low, también son efectivos, de tal manera que lo primero que vamos a hacer es buscar la versión de la base de datos para comprobar que esto es cierto.
Como vemos la base de datos sigue siendo vulnerable a las inyecciones. ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a mirar si somos capaces de que nos de todas las tablas que contiene la base de datos para ello UNION BASED --> DIOS MYSQL --> DIOS BY ZEN.
Cómo el código del inyectador puede que no se vea bien esta es la inyección que se le aplica a la base de datos: http://192.168.1.131/dvwa/vulnerabilities/sqli/?id=2 UNION SELECT 2, make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6 c693e,table_name,column_name)),@) -- - &Submit=Submit# Y obtenemos una salida como esta:
Estas son todas las tablas que tiene la base de datos y las columnas de la base de datos, en sus tablas. Estudiándola un poco en detenimiento, nos percatamos, de que existe una tabla que contiene las columnas firs_name y password, (arriba la foto de la salida de las columnas) ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// Ahora vamos a ver si podemos acceder a estas columnas, para ello vamos a pedir que nos muestre concatenadamente las columnas first_name y password de la tabla users, para ello utilizamos esta inyección:
Cómo el código del inyectador puede que no se vea bien esta es la inyección que se le aplica a la base de datos: http://192.168.1.131/dvwa/vulnerabilities/sqli/?id=2 union select null, concat(first_name,0x0a,password) from users -- - &Submit=Submit#
Ya hemos obtenido los hash de los usuarios, solo quedaría utilizar las aplicaciones de tablas rainbow, o los sitios web que las tienen online y las descifran mediante internet.
Lo primero que vamos a hacer es seleccionar en DVWA Security el nivel high para empezar por lo más sencillo.
Cuando lo tengamos el high y hayamos clicado sobre submit, nos dirigiremos a SQL Injection para poder empezar a buscar vulnerabilidades.
El nivel high no es vulnerable a las inyecciones que ya hemos visto en los niveles low y medium, así que, por el momento no entraré en este nivel, por lo menos por ahora… . Aunque voy a hacer unos comentarios acerca de este nivel. El parámetro id tiene dos fortificaciones MYSQL, la primera stripslahes, este parámetro evita la introducción de la comilla (apostrofe) que utilizamos para poder atacar la base de datos, he estado probando con el encodeado gbk de esta comilla y no he obtenido ningún resultado. El segundo comentario se basa en el parámetro mysql_real_escape_string(), que la función que realiza consiste en que no funciones la inyección 1’ or 1=1# Dadas estas medidas de seguridad, si en algún momento descubro cómo romper esta seguridad, os lo contaría en la versión 2 de esta guía.
CONCLUSIONES En los ataques de SQL INJECTION, debemos conocer a fondo, los métodos con los que pedimos información a las bases de datos, tablas y columnas, dado que es a través de ellos que realizamos las inyecciones, así, como las medidas de seguridad que van implementando las versiones de SQL, para estudiar como romper esa seguridad. Cómo habéis podido comprobar, las inyecciones, no son demasiado complicadas, solo es cuestión de paciencia. Las herramientas como la extensión @H3LL4R_H5H HackMOD, para la inyección de los headers, nos facilita en gran medida la labor. Es posible que al principio os cueste haceros con la herramienta, pero en menos de una hora, controlaréis las funciones más fundamentales de la misma. Servidor no es un experto en estas técnicas, pero se sentía agradecido con la información que la red le ha proporcionado y quería aportar su granito de arena en el conocimiento de las inyecciones a bases de datos, creyendo que realizar documentos, es un método para que los conocimientos, no solo no se pierdan, si no que crezcan entre los usuarios que tengan ganas de ponerse a “jugar” con este tipo de máquinas. Estoy casi seguro de que habrá otras maneras de realizar estas inyecciones, y estaría muy agradecido de que me lo comunicaseis si así lo creéis oportuno, toda mejoría es agradecida y puesta en práctica. Sin más, ni más me despido de esta guía con muy buen sabor de boca, y muchas ganas de seguir practicando estas técnicas.