Lab: Blind SQL injection with conditional responses – Portswigger [Write Up]

Este laboratorio es el inicio de una serie de laboratorios sobre Blind SQLi.

Un blind SQLi ocurre cuando no puedes ver directamente los datos de la base de datos en la respuesta del servidor, pero aún puedes inferir información a través de las respuestas (por ejemplo, si la página carga correctamente o no, o si hay un cambio en el tiempo de respuesta).

Este tipo de ataque se diferencia de los laboratorios anteriores donde el ataque era SQLi, en que en el de tipo UNION attack, una vez hemos manipulado la consulta o query con un payload en tiempo real vemos el ataque con una respuesta en el servidor de un estado 500, sin embargo, en el de tipo blind , aunque modifiquemos el user cookie trackind ID por ejemplo, la respuesta sigue dando 200, pero no significa que no sea potencialmente vulnerable a SQLi, sólo que no vemos directamente en la respuesta del servidor que el ataque es viable y obtenemos la respuesta.

En este lab, intentaremos extraer la contraseña del usuario administrator y logarnos en el panel para resolverlo.

Y usaremos Burp Suite pero no modificando el parámetro de la url a nivel de categorías, sino, directamente sobre la página del lab y modificando el tracking ID.

En este caso el objetivo de nuevo es conseguir de nuevo las credenciales del usuario administrator pero en lugar de hacer un ataque por UNION, como nos sabemos la respuesta del servidor al inyectar el payload en la respuesta, tenemos que aplicar otro ataque llamado blind sqli.

Como siempre, este Lab se encuentra dentro del listado de laboratorios de la plataforma de Portswigger Web Security Academy dentro de la vulnerabilidad SQL injection como Practitioner.

Inicialmente lo que hacemos es acceder a la página del laboratorio, y antes de clicar en cualquier categoría, abrimos BurpSuite dentro de Kali, activamos «On» la petición y activamos el FoxyProxy para enviar a Burp la petición y así manipularla.

Clicamos en cualquier categoría, vamos a la petición GET en la pestaña Proxy y la enviamos al Repeater con el botón derecho sobre la petición (o Control+R) y de seguido la enviamos al Intruder.

Sabemos que el ataque está en el TrackingId, por lo que vamos a modificar ese valor con los siguientes comandos:

ID'+and+(select+username+from+users+where+username%3d'administrator'+and+LENGTH(password)>1)%3d'administrator'--;
  • Se realiza una subconsulta que verifica si existe un usuario llamado administrator cuya contraseña tiene una longitud mayor a 1.
  • Si la condición es verdadera (LENGTH(password) > 1), la consulta devuelve 'a', y la página responderá normalmente.
  • Si es falsa, la página podría mostrar un error o comportarse de manera diferente.

Si del payload, sustituimos el valor del length 1 por §1§ (lo hacemos seleccionando el número 1 en el Intruder de Burpsuite y dándole a «Add§»), en ese caso lo que hará la herramienta será probar diferentes valores hasta encontrar el punto donde la respuesta del servidor cambia, indicando que has descubierto la longitud correcta de la contraseña.

Después vamos a la parte de Payloads para configurarlo antes de realizar el ataque. Lo que haremos será, seleccionando §1§, nos vamos a la pestaña Payloads, cambiamos los valores en amarillo

Esto hará que la herramienta en el ataque con la opción «Sniper», vaya probando para el valor de contraseñas de la tabla users la longitud que corresponde para el usuario administrator hasta llegar al 30. Si pasado el 30 (la longitud cambia) ahí nos indicará el número de caracteres.

En este caso al lanzar el ataque, vemos que la longitud cambia en el 20 por lo que la password del adminstrator tiene 20 caracteres:

Ahora que sabemos la cantidad de caracteres, lo que nos queda es probar con los valores alfanuméricos que tendrá la password para cada una de esas 20 posiciones.

Por lo que ahora el payload consiste en:

ID' and (select substring (password,1,1) from users where username='administrator')='a'--

Lo ponemos en el Repeater y lo enviamos, y la respuesta no devuelve un Welcome back! por lo que la password no contiene la letra «a».

Ahora, para automatizarlo y probar con todas las letras del abecedario, números, etc, se realiza lo siguiente desde el Intruder:

ID'+and+(select+substring+(password,1,1)+from+users+where+username%3d'administrator')%3d'§a§'--

vamos a la configuración del payload en formato «Brute forcer» y start attack:

Al lanzarlo vemos que de todos los números y letras y ver la longitud, todas coinciden salvo una:

Es decir, que el primer caracter es «8», por lo que habría que hacer esto con cada una de las posiciones. En lugar de hacerlo una a una, lo haremos con el ataque llamado «Cluster bomb»

Añadimos el 1 y la a como valores a reemplazar, y en el payload lo configuraríamos:

para el primer payload de posiciones:

para el segundo de letras y números:

AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§:

  • SELECT SUBSTRING(password,§1§,1):
    • Utiliza la función SUBSTRING() para extraer un único carácter de la contraseña.
    • §1§ es un marcador que será reemplazado por una posición (como 1, 2, 3, etc.) para iterar sobre cada carácter de la contraseña.
    • Esto significa: «Devuélveme el carácter en la posición §1§ de la contraseña».
  • FROM users WHERE username='administrator':
    • Especifica que la consulta debe centrarse en el usuario administrator.
  • ='§a§:
    • Compara el carácter extraído (SUBSTRING) con un valor específico (§a§), que también es un marcador. Este marcador será sustituido por diferentes valores (como a, b, c, etc.) para probar todas las posibles combinaciones.
    • §1§: Será reemplazado por números (1, 2, 3, …) para probar cada posición de la contraseña.
    • §a§: Será reemplazado por caracteres (a, b, c, …, 0, 1, 2, …) para probar cada posible valor en esa posición.
  • Esto comprueba si el primer carácter de la contraseña es a.
  • Si la respuesta del servidor indica que la condición es verdadera, entonces el atacante sabe que el primer carácter es a.
  • Si es falsa, probará con b, c, y así sucesivamente.

Una vez lanzado el ataque y finalizado, veremos estos resultados que podremos filtrar por el valor length, y así poder ver los que incluyen el «Welcome back!» en la respuesta:

Y ya sólo quedaría ordenar las posiciones del payload1 que corresponden con el valor alfanumérico del payload2.

En mi caso el valor de la password para el usuario administrator es 5fh24b44onc935xnrqkz

pero para el tuyo será diferente porque dependerá del valor del trackingID y de la sesión de la cookie.

Si tienes la versión Community de Burpsuite como yo, el realizar el ataque anterior con 2 payloads te va a llevar 1h o más, por lo que si no quieres esperar, y no tienes la versión PRO del Burpsuite, puedes intentar ejecutar un script en python desde tu máquina virtual.

Aquí te dejo un video tutorial muy sencillo explicado que te ayudará con el script, y recuerda que puedes acceder al script en el github siguiente:

Otros posts relacionados