Web Security Academy

SQL injection - Lab : SQL injection UNION attack, retrieving multiple values in a single column

Objectif :

  • Réussir à récupérer tous les identifiants et mots de passe des utilisateurs du site pour ensuite se connecter en tant qu'administrateur, sachant que la table des utilisateurs dans la base de données s'appelle users et elle contient deux colonnes : username et password.

Solution :

On lance le lab et on se trouve dans un site de commerce avec des articles en vente.

On peut filtrer l'affichage des produits selon leurs catégories :

Pour traiter ce filtrage, une requête GET est envoyée au serveur avec comme paramètre la catégorie choisie. Dans l'image ci-dessous, un exemple est représenté avec la catégorie "Gifts" :

Les produits vendus sont stockés dans une base de données. On va essayer de modifier la requête SQL ( liée à la selection des produits affichés ) envoyée au serveur en utilisant le paramètre GET.

Dans un premier temps, on va utiliser l'opérateur UNION pour retrouver le nombre de colonnes retourné par le serveur. On trouve deux colonnes (le payload Gifts' UNION SELECT NULL,NULL-- ne retourne pas d'erreurs).

Ensuite, on vérifie le type de chaque colonne. Si on soumet au serveur Gifts' UNION SELECT 1,'test'-- et aucune erreur n'est retournée. Ce qui signifie que la première colonne est du type entier et la deuxième de type "string".

On va maintenant afficher toute la table users.

Il faut afficher deux informations (nom de compte et mot de passe) sur une colonne. On va utiliser une concaténation. Ce qui donne : Gifts' UNION SELECT 1,username||'~'||password FROM users--. Ce payload fonctionne sur une base de données du type Oracle ou PostgreSQL.

On soumet ce payload et effectivement, le serveur nous affiche toute la table users avec le mot de passe de l'administrateur:

On se connecte avec et le lab est validé !