viernes, 12 de octubre de 2018

Inyección SQL basada en errores




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?
  1. Se realiza una petición a la wapp
  2. La wapp recibe una petición y la consulta a la BBDD (consulta SQL)
  3. La BBDD ejecuta la consulta y devuelve el resultado
  4. El usuario recibe el resultado de la petición
¿Como funciona el ataque?
  1. Un usuario malicioso modifica la petición e inyecta código SQL
  2. La wapp recibe la petición y consulta  a la BBDD con el código inyectado
  3. La BBDD recibe el código no validado y devuelve los datos 
  4. 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'

Estaremos enviando:

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


Existen varios tipos de ataques que podemos explotar dependiendo de la vulnerabilidad que contenga la aplicación, entre ellos tenemos:


  • SQLi basado en errores
  • 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: realiza  la obtención de información almacenada en la BBDD  

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




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


Ya hemos visto como funcionan las inyecciones en una BBDD vulnerable pero vamos a subir un poco la dificultad de nuestro DVWA para realizar algunas pruebas más.

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




4. De la misma manera anterior procedemos a inyectar el código que nos mostrará el password de los usuarios de la BBDD pero esta vez con Burp

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.


1. En este nivel nos encontramos con un link



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º


prueba 3º


prueba 4º - correcta


4. La inyección utilizada es 1' or 1=1# que nos muestra los usuarios de la BBDD



5. Las inyecciones se repiten así que para sacar el password de los usuarios utilizamos una parecida a las anteriores, 1' or 1=1 union select user, password from users#, y volvemos a tener los hashes de los passwords





No hay comentarios:

Publicar un comentario