Blind SQL injection with time delays and information retrieval writeup

Descripción

This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs a SQL query containing the value of the submitted cookie.

The results of the SQL query are not returned, and the application does not respond any differently based on whether the query returns any rows or causes an error. However, since the query is executed synchronously, it is possible to trigger conditional time delays to infer information.

The database contains a different table called users, with columns called username and password. You need to exploit the blind SQL injection vulnerability to find out the password of the administrator user.

To solve the lab, log in as the administrator user.

Blind SQL injection with time delays and information retrieval writeup

Debido a la complejidad del laboratorio, lo dividiremos en varias fases:

Encontrar el parámetro vulnerable, tipo de base de datos y creación del condicional

Repetiremos lo realizado en el laboratorio anterior (Blind SQL injection with time delays), lo cual nos llevará a descubrir que es una base de datos de PostgreSQL y que el parámetro vulnerable es la cookie ‘TrackingId’:

Nota: He borrado el valor de la cookie para evitar errores de desbordamiento.

Ahora construiremos la consulta condicional para provocar un delay en caso de que sea correcta. Según la cheatsheet SQLi de PortSwigger, la estructura para PostgreeSQL es la siguiente:

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END

Modificaremos la estructura para comprobar que, como dice el enunciado, existe un usuario con el ‘username’ ‘administrator’ en la tabla ‘users’:

'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Nota: Se debe usar el ‘;’ codificado ‘%3B’, para indicar que se ha acabado la consulta del ‘TrackingId’ y estamos añadiendo otra nueva, al igual que el ‘–‘, para comentar el resto de la consulta.

La página tardará 10 segundos en cargar, por lo que sabremos que el usuario ‘administrator’ existe.

Determinar la longitud de la contraseña de administrator

Nos llevaremos la petición al ‘Intruder’ con Ctrl + I o Click derecho -> Send to Intruder. Ahí lo modificaremos:

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)=SS)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Nota: No puede haber espacios en la query, si los hay no se ejecutará el ‘pg_sleep’.

Usaremos la siguiente configuración:

Ordenaremos los resultados por ‘Response received’, de mayor a menor.

Ahora vemos que la contraseña tiene 20 caracteres.

Realizar fuerza bruta a la contraseña

Cambiaremos el código al siguiente:

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,SS, 1)='SS')+THEN+pg_sleep(20)+ELSE+pg_sleep(0)+END+FROM+users--

Nota: Se ha cambiado el delay a 20 segundos debido a que, con 10, había varios falsos positivos.

Y el tipo de ataque a Cluster bomb:

Una vez finalice, apuntaremos todas las letras del ‘Payload 2’ cuya ‘Response received’ sea superior a 20.000.

Apuntaremos la contraseña, en mi caso ‘u2e1mjq48ch28h6toutf’. Iniciaremos sesión en ‘My account’ en el navegador y completaremos el laboratorio:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *