Tickets
Dernière mise à jour
Cet article vous a-t-il été utile ?
Dernière mise à jour
Cet article vous a-t-il été utile ?
Flag: -
Ce challenge tourne sur un docker et n'est pas disponible
On commence par créer un compte puis se connecter :
L'injection se passe dans le paramètre type
de /support
:
Voici le code qui correspond à cette partie du site, je l'ai commenté pour expliquer un peu plus :
Ligne 16
, on utilise la blacklist de mots interdits de la mauvaise façon car la casse n'est pas prise en compte. Donc si SELECT
est détecté, ce n'est pas le cas pour Select
par exemple.
Il faut noter que la blacklist retire la virgule, ce qu'il faudra prendre en compte pour notre payload.
Ligne 17
permet de limiter les caractères utilisés, mais on s'en fout.
Déjà, on voit que notre injection passe, on a modifié la query. Désormais, il faut la rendre valide.
Ce qui donne l'erreur :
Ce n'est plus qu'une question de nombre de colonnes, on va en ajouter jusqu'à ce que ça fonctionne. Finalement, avec 6 colonnes :
Maintenant que l'on connaît le nombre de colonnes et lesquelles sont affichées, on peut faire des requêtes arbitraires pour récupérer des données.
Dans les sources, on a le fichier data.sql
. Dedans, on voit que le flag est dans la colonne password de la table users
, il suffit alors de récupérer les mots de passe de cette table. On va mettre cette query dans la colonne 2 puisque la 1 n'est pas affichée.
On commence par vérifier que l'injection fonctionne, ici, j'utilise pour rejouer et modifier la requête sur le /support
. On va également se servir des sources pour lancer le site en local et observer les erreurs SQL en direct avec la commande docker compose up
à la racine du dossier.
Pour ça on va utiliser pour faire un UNION SELECT
sans virgule. Il ne faut pas oublier l'espace à la fin du payload pour commenter la suite de la query de base : --
. La requête qu'on vient de faire n'a pas cette espace à la fin, c'est ce qui provoque l'erreur. Le nouveau payload :