DVWA - SQL injection (Blind)
Starting the challenge
Refer to the post start DVWA with Docker to learn how to start DVWA.
I will mostly use Burp Suite to solve the challenges. To configure Burp suite refer to the post configure burp suite for DVWA.
Click on the SQL Injection (Blind) button on the left menu to access the challenge.
Low level
Découverte de l’application
Pour accéder au challenge SQL injection (Blind) nous cliquons sur le bouton correspondant dans le menu gauche.
Nous accédons à une application nous permettant de sélectionner un user ID. En sélectionnant un USER ID et en cliquant sur Submit nous obtenons une information sur l’existance de l’utilisateur.
En naviguant dans Proxy > HTTP history on peut retrouver la requête envoyée lorsque nous avons cliqué sur Submit.
On peut voir que cette requête envoi l’identifiant utilisateur via le paramètre id de la requête POST.
Vulnérabilité SQL
Si l’utilisateur existe dans la base de donnée, l’application nous renvoie : “User ID exists in the database”. Autrement, l’application renvoie “User ID is MISSING from the database”. Nous pouvons commencer par tester si une injection SQL est possible en modifiant la réponse du serveur.
Par exemple nous savons que l’ID 1 existe dans la base. En injectant “AND 1=2”, la requête testée par le serveur ressemblera à
SELECT * FROM USERS WHERE ID=1 AND 1=2
Ainsi même si notre ID existe dans la base de données, l’application devrait penser que ce n’est pas le cas car l’assertion “1=2” est fausse.
Pour tester notre hypothèse nous naviguons dans Proxy > HTTP history puis envoyons notre dernière requête vers le repeater (clic-droit > Send to Repeater).
Ensuite nous modifions le champ id pour que l’id passé soit 1 AND 1=2
encodé en URL.
On peut automatiquement encoder en URL en choisissant l’option clic-droit > URL-Encode as you type.
Comme on peut le voir sur la capture notre test a fonctionné, l’application est bien vulnérable.
Time based SQLi
La différence entre une injection SQL normale et une injection blind est la réponse du serveur.
En général dans une injection SQL classique, nous obtenons une réponse verbeuse du serveur qui nous permet de récupérer les informations de la base de données. Nous pouvons ainsi forcer le serveur à afficher la liste des tables de la base de données dans ses réponses.
Dans une injection SQL blind nous ne recevons pas de réponse nous permettant de récupérer directement les informations de la base. Le serveur enverra au mieux une information binaire du type existe ou n’existe pas.
Pour exploiter une injection à l’aveugle nous utilisons des commandes modifiant les temps de réponses de la base de données, comme la commande SLEEP() par exemple.
De cette façon nous parvenons à soutirer des informations de la base de données en observant les temps de réponse du serveur.
On peut par exemple tester une requête avec 1 AND SLEEP(5)--
.
Notre réponse devrait mettre 5 secondes (5000ms) à arriver.