Respuesta condicional en Inyección BLIND-SQL
Table of Contents
ToggleIntroducción
¿A qué nos referimos con Respuesta condicional en Inyección BLIND-SQL? Para entender esto mejor, y con práctica, a continuación estaremos realizando una máquina de PortSwigger. El fin de la misma, es encontrar el Password del usuario Administrator y luego acceder a la cuenta de dicho Usuario. Ahora bien, recordemos que anteriormente teníamos como datos la tabla users, las columnas username y password, y el usuario administrator.
Sin embargo, la máquina nos da como referencia lo siguiente:
- “Visite la página principal de la tienda y use Burp Suite para interceptar y modificar la solicitud que contiene la cookie TrackingId”
- “Los resultados de la consulta SQL no se devuelven y no se muestran mensajes de error. Pero la aplicación incluye un mensaje de ‘Welcome Back!’ en la página si la consulta devuelve filas.”
Recordemos que, en un escenario real, estos datos no los tendremos. Por lo tanto, seguiremos los siguientes pasos para resolver el laboratorio:
1) Verificar que el sitio web sea vulnerable a Blind SQLI
Luego de realizar consultas tales como 1’ or 1=1 — – veremos que no se nos muestra nada en pantalla. Sin embargo, podemos comprobar que es vulnerable a una inyección sql blind ya que nos aparece el mensaje de “Welcome back!” y, no se nos aparece ningún mensaje de error o pantalla en blanco.
Cabe mencionar que, a veces no podremos usar el ‘or’ por que se encuentra en una “lista negra” por seguridad u otras razones. Sin embargo, esta no es la razón principal por la que no lo usaremos. Recordemos que ‘or’ nos devuelve solo un resultado dado dos opciones y, diferente a esto, con ‘and’ le decimos al sistema que nos devuelva dos resultados (dependiendo la función, los mismos pueden o no, estar relacionados). Estaremos viendo esto con distintas funciones, como substring(), case(), etc…
Ahora bien, recordemos que debemos centrarnos en la cookie “Tracking ID”. Para esto, usaremos nuestra herramienta BurpSuit:
Enviamos dicha información recibida al Repeater. Esto lo podemos hacer haciendo click derecho y eligiendo la opción como se muestra en pantalla. O también, usando Ctrl+r.
Podemos ver que se encuentra nuestra Cookie con su valor, el cual estaremos modificando para enviarle consultas. A su vez, vemos nuestra petición GET, o consulta, filter?category= 1’ and 1=1 — –. Por lo tanto, damos click en el boton send y obtendremos el siguiente resultado:
Podemos ver que abajo hay un buscador el cual nos permite «matchear» nuestra frase clave para saber si hemos tenido éxito. Por lo tanto, en base a esto podemos suponer dos cosas:
- En caso de que nuestra consulta sea TRUE, obtendremos como resultado “Welcome Back!” y, en caso de que nuestra consulta sea FALSE, no obtendremos resultado.
- Podemos buscar más información en base a la misma respuesta, pero modificando el valor de dicha cookie.
2) Verificar la existencia de la tabla users:
Si bien, la máquina nos dice que existe la tabla users, vamos a verificar que esto es cierto ya que, en un caso real, estos datos no los tendremos.
Primero confirmemos que podemos modificar el valor de la cookie. Podemos suponer que detrás del sitio web hay una query como la siguiente:
SELECT * FROM table WHERE trackinID = ‘T10u37NYKXWLMlYH’
Por lo tanto, simplemente podríamos agregar ‘ — – para verificar si es vulnerable ya que, deberíamos tener como respuesta “Welcome Back!”
Como vemos, tenemos una respuesta condicional en inyección Blind-SQL. Entonces, ahora debemos verificar que exista la columna user. Para esto usaremos la siguiente consulta:
SELECT * FROM table WHERE trackinID = ‘T10u37NYKXWLMlYH’ and (select ‘a’ from users LIMIT 1) = ‘a’ — – ‘
Lo que hacemos con esta consulta es buscar un valor de la tabla users que contenga el caracter ‘a’ ya que, en caso de ser correcto, podremos verificar que existe dicha tabla.
Como podemos ver, existe la tabla users. Cabe mencionar que también es válido usar la siguiente consulta:
SELECT * FROM table WHERE trackinID = ‘T10u37NYKXWLMlYH’ and (select ‘a’ from users LIMIT 1) = ‘a ’
3) Verificar que existe el usuario administrator dentro del campo username.
Para esto podemos probar varios tipos de columnas como user, user-name, user_name, etc… Y lo mismo con admin, administrator, admin_user, etc…
Por lo tanto, probaremos con la siguiente consulta:
SELECT * FROM table WHERE trackinID = ‘T10u37NYKXWLMlYH’ and (select username from users where username = ‘administrator’) = ‘administrator’ — – ‘
Por lo tanto, podemos confirmar que existe el Usuario administrator. Junto con la tabla users en la misma base de datos.
4) Encontrar el password y la cantidad de caracteres que posee
Sabiendo que se trata de una respuesta condicionar en inyección BLIND-SQL, lo primero que debemos hacer es conocer la cantidad de caracteres que posee dicha contraseña ya que, un dato importante que podemos saber en cuanto a la contraseña del usuario administrator, es conocer su longitud o cantidad de caracteres que posee su password. Esto lo realizamos de la siguiente manera:
SELECT * FROM table WHERE trackinID = ‘T10u37NYKXWLMlYH’ and (select ‘a’ from users where username = ‘administrator’ and LENGTH (password)>number) = ‘a’ — – ‘
Donde en “number” tendremos que colocar la cantidad máxima de caracteres que creemos que posee dicho password. Por ejemplo, intentemos colocando 20:
Vemos que no tenemos resultado. Por lo tanto, ya sabemos que la contraseña no posee más de 20 caracteres.
Ahora bien, probemos colocando 19:
Como podemos ver, hemos tenido éxito. Esto significa que la cantidad de caracteres es mayor a 19 pero NO mayor a 20. Por lo tanto, la cantidad de caracteres es 20
Esto es una cuestión de prueba y error. Sin embargo, también podríamos haber pasado dicha petición al intruder y verificar uno por uno la cantidad de caracteres o haber usado la siguiente consulta:
(password)>=20) =’a’ — –
5) Enumerar los caracteres específicos, en cada posición, del password
Para realizar esta parte, estaremos haciendo uso de la función substring(). La misma nos será de gran ayuda
Función SUBSTRING()
Esta función nos permite extraer, a partir de una determinada posición, una determinada cantidad de caracteres.
Lo que hacemos con substring es decirle al sistema que, teniendo en cuenta el campo password, pruebe en el primer caracter el valor de uno o más caracteres, por ejemplo ‘a’. En caso de ser FALSE, NO nos devolverá ningún mensaje y, en caso de ser TRUE, nos devolverá “Welcom Back!”. Ahora bien, esto es con respecto al primer caracter. Por lo tanto, si quisiéramos saber cuál es el segundo caracter, deberíamos colocar substring(password,2,1) y probar todos los caracteres [a-zA-Z] y [0-9] como en el primer caso.
A modo de ejemplo, vamos a usar substring (username,1,1) para comprobar que el primer carácter del usuario administrator es ‘a’ de la siguiente manera:
SELECT * FROM table WHERE trackingID = ‘T10u37NYKXWLMlYH’ and (select substring (username,1,1) username from users where username = ‘administrator’ ) = ‘a’ — – ‘
A tener en cuenta
Según el sitio web cheat-sheet de Portswigger debemos saber lo siguiente:
“Puede extraer parte de una cadena, desde un desplazamiento especificado con una longitud especificada. Tenga en cuenta que el índice de compensación está basado en 1. Cada una de las siguientes expresiones devolverá la cadena ‘ba’.”
Teniendo todo esto en cuenta, para saber el password del usuario administrator haremos uso del Cluster Bomb:
Uso de Cluster Bomb en una Respuesta Condicional de inyección BLIND-SQL
Primero colocamos la siguiente consulta y le damos al botón de send. Luego dirigimos el contenido del Repeater al Intruder con click derecho o también con Ctrl+i.
Luego de esto, primero nos dirigimos a la sección Positions. Segundo deberemos especificar dos cosas:
La posición de cada caracter del password (password,1,1)
Los caracteres a probar con respecto a la posición (‘a’)
Por tanto, remarcamos el primer número dentro de substring ‘1’ de nuestra consulta y damos click en “Add”. Hacemos lo mismo con los pasos 4 (remarcar el caracter ‘a’) y 5 marcado en la siguiente imagen. Finalmente, elegimos nuestro ataque de forma “Cluster Bomb”.
Nos dirigimos a la sección Payloads y colocamos los siguientes parámetros correspondientes a la posición de cada caracter como vemos a continuación:
Como hicimos anteriormente, nos dirigimos al payload 2 dentro de “Payload set:” y, con respecto a los caracteres que vamos a probar, colocamos los siguientes datos:
Y finalmente, le damos al botón de “Start attack”
A continuación, empezará a buscar las contraseñas caracter por caracter por lo que demorará algo de tiempo. Por lo tanto, deberemos esperar que realice dichas operaciones.
Como vemos, tenemos en la columna del Payload 1 la posición del caracter del password y, del lado derecho tenemos Payload 2, los caracteres con los que se probaron cada posición. Ahora deberíamos probar uno a uno si se cumple el filtro “Welcome back!” en el Response. Esto también puede tomar tiempo.
No obstante, a continuación, veremos en detalle un script hecho en Python el cual nos servirá para saber dicho password de una forma mucho más eficiente y rápida. Para esto recomendamos instalar las pwntools de Python de la siguiente manera: pip3 install pwntools.
Script en Python para Respuesta Condicional en Inyección BLIND-SQL
Desarrollaremos una función tal que, a través de fuerza bruta, para cada posición de caracter del password, pruebe todas las letras [a-z] y todos los números [0-9]. Podemos hacer uso de dicho script a través de una terminal. También, a través de un editor de texto como es el caso del Visual Studio Code. No debemos olvidar dar permisos de ejecución a dicho script.
Teniendo en cuenta lo anterior:
En esta primera parte definimos las librerías a utilizar y la función BruteForece() para buscar caracter por caracter en cada posición del password.
Para iniciar y, parar la función a través de Ctrl+C, lo hacemos mediante las siguientes líneas:
Por lo tanto, en base a esto, guardaremos dicho script en un archivo llamado blind-sqli-CR.py y lo ejecutaremos de la siguiente manera:
Entonces, para la posición 1 del password, le corresponde el caracter ‘w’. Para la posición 2 del password, le corresponde el caracter ‘r’. Para la posición 3 del password, le corresponde el caracter ‘f’. Y así sucesivamente…
Ahora bien, procedemos a colocar dicho usuario y contraseña:
Como podemos ver el password ingresado es correcto. ¡Hemos resuelto el laboratorio!
Recuerde que en el blog de Lathack puede aprender sobre Base de datos y Prenvención de Inyección SQL con Python.