Inyecciones SQL basadas en tiempo

¡Hola Hacker! Bienvenid@ a un nuevo artículo.
En este quinto artículo de la serie de Inyecciones SQL, toca hablar de las inyecciones SQL basdas en tiempo.
Las inyecciones SQL basadas en tiempo, también conocidas como Time-Based Blind SQL Injection, son una técnica de ataque que se utiliza cuando el atacante encuentra una vulnerabilidad de inyección SQL en una aplicación web y la aplicación no devuelve mensajes de error visibles. En lugar de obtener respuestas inmediatas de la aplicación, el atacante aprovecha los retrasos en las respuestas para extraer información de la base de datos.
Para demostrar esta inyección SQL, utilizaremos el script search_user_by_id.php el cual toma el parámetro id por GET y realiza una búsqueda del usuario con el id correspondiente.
Creamos el script en la carpeta app de nuestro laboratorio.

Aquí, la consulta fuerza a la base de datos a esperar 2 segundos antes de continuar (por lo general es más de dos segundos), lo que permite detectar la vulnerabilidad observando los tiempos de respuesta.
Podemos visualizar mejor esto, usando los comandos time y curl para realizar la petición.

Obtener las bases de datos
Para obtener las bases de datos utilizaremos la siguiente petición:
Lo cual genera la siguiente consulta SQL:

Expliquemos paso a paso cada una de las partes que componen la consulta para entenderlo mejor.
En primer lugar, tenemos nuestra consulta prinicipal, la cual consulta a la tabla users para obtener el valor del campo name donde el id sea igual a 1.

Luego viene la subconsulta.
Esta subconsulta se inyecta dentro de la consulta original. Vamos a desglosarla:
SELECT SUBSTRING(GROUP_CONCAT(schema_name),1,1) FROM information_schema.schemata:information_schema.schemata: Es una tabla que contiene los nombres de todos los esquemas (bases de datos) en el servidor MySQL.GROUP_CONCAT(schema_name): Esta función concatena todos los nombres de esquemas en una sola cadena.SUBSTRING(...,1,1): Extrae el primer carácter del resultado concatenado.
Este fragmento de código obtiene el primer carácter del primer nombre de esquema en el servidor.


En este caso, la primera base de datos es information_schema por ende, el primer caracter de esta corresponde a la letra i.
ASCII(...):La función
ASCII()devuelve el valor ASCII del primer carácter del primer esquema que se obtuvo en la subconsulta anterior. El valor deASCII()para caracteres como 'a', 'b', 'c', etc., puede usarse para realizar comparaciones.
En este caso, la letra i le corresponde el valor ascii 105.

IF(ASCII(...) = 105, SLEEP(2), 0):Si el valor ASCII del primer carácter del primer nombre de esquema es igual a 105 (que corresponde al carácter 'i' en el sistema ASCII), entonces ejecutará
SLEEP(2), lo que provoca que la base de datos se detenga durante 2 segundos.Si el valor no es 105, no hace nada (devuelve 0).

Ahora que tenemos claro como funciona la inyección SQL y como podemos explotarla, podemos automatizar este proceso montando un script en Python el cual obtenga todas las bases de datos.
Ejecutamos el script:

Genial, logramos obtener las bases de datos.
Obtener las tablas
El proceso es similar al anterior, solo que utilizaremos la tabla information_schema.tables.
Ejecutamos el script:

Obtener las columnas
Ejecutamos el script:

Obtener los datos

De esta manera, logramos obtener los usuarios.
Así concluimos este artículo.
Conlusiones finales
A lo largo de este artículo, hemos demostrado cómo las inyecciones SQL basadas en tiempo constituyen un ataque que explota las variaciones en los tiempos de respuesta de una base de datos para extraer información de forma indirecta. Utilizando funciones como SLEEP(), un atacante puede inducir retrasos en las respuestas del servidor, lo que le permite inferir detalles sobre la estructura de la base de datos, como los nombres de esquemas, tablas y otros elementos sensibles, sin necesidad de obtener datos visibles explícitamente.
Para mitigar este tipo de ataques, es fundamental:
Sanitizar y validar entradas: Usar consultas parametrizadas.
Principio de menor privilegio: Limitar permisos de acceso.
Firewalls de aplicaciones web (WAF): Detectar y bloquear inyecciones.
Monitoreo: Detectar comportamientos inusuales, como retrasos en las respuestas.
¡Gracias por leer!
¡Happy Hacking!
Última actualización