ECW 2017 - Web - Hall of Fame

L’ECW 2017 est un challenge Jeopardy français organisé par le Pôle d’Excellence Cyber en partenariat avec la Région Bretagne, Airbus et Thalès. Hall of Fame est un challenge web basé sur les injections SQL en UNION.

Du 06/10 au 22/10 2017, il sert de pré-sélection pour l’épreuve finale de type Capture The Flag qui débutera le 29 novembre 2017 lors de la conférence de l’European Cyber Week à Rennes.

Découverte

Le challenge commence par l’arrivée sur une page présentant le “Hall of fame” du CTF de 2016, avec un champ permettant de filtrer selon le nom. On pense directement à tenter une injection.

hall_of_fame_1

Injection SQL

On commence par tester si le champ est vulnérable aux injections SQL.

pseudo='

Aucun retour ici. On tente d’utiliser la clause ORDER BY pour tester de nouveau.

pseudo=' order by 1#

On a un retour ! Comportement normal, pas de changement sur la page. Le champ semble vulnérable à une injection SQL. On peut donc continuer nos investigations.. On incrémente progressivement.

pseudo=' order by 6#
pseudo=' order by 7#

Plus de retour à partir de 7. On peut donc en déduire que la table contient 7 colonnes. On cherche ensuite à repérer les colonnes vulnérables. On utilise pour cela une requête UNION.

pseudo=' union select 1,2,3,4,5,6#
hall_of_fame_2

Parfait ! On sait maintenant que les colonnes 3,4 et 5 sont vulnérables. Il faudra donc injecter dans ces champs afin d’afficher les informations contenues dans la base de données.

Exfiltration de données

On commence maintenant à rechercher des informations dans la base de données. La première chose à faire est de trouver le nom de la table utilisée.

pseudo=' union select 1,2,3,table_name,5,6 from information_schema.tables where table_schema=database()#
hall_of_fame_3

On va ensuite pouvoir lister les colonnes de la table, toujours selon le même principe.

hall_of_fame_4

Great ! Une colonne “password”… Intéressant, allons voir ce que cela contient ! La requête utilisée ici est encore plus simple puisqu’il suffit simplement de demander le contenu de la colonne password.

pseudo=' union select 1,2,3,password,5,6 from users#
hall_of_fame_5

Bon.. Il est très probable que le flag soit un de ces passwords.. Mais comment savoir lequel prendre ? Deux solutions ici :

– Les essayer tous un par un.. 😀 – Essayer de chercher d’autres informations qui pourraient nous mettre sur la bonne voie.

Nous allons préférer la seconde méthode, plus pédagogique et intéressante pour un write-up. Si on revient sur le retour précédant l’affichage des passwords, on remarque que :

– L’affichage classique du mur comprend le rang, le username ainsi que le score. – Une autre colonne, appelée “comment” n’est pas affichée.

Allons donc afficher le contenu de la colonne “comment”.

pseudo=' union select 1,2,3,concat(comment,password),5,6 from users#
hall_of_fame_6

Récupération du Flag

Un seul commentaire.. Qui fait en plus référence à la création de challenges CTF. Il semble bien que nous ayons trouvé le flag ! 😉

Après validation, il s’agit bien du flag !

Références

TamuCTF 2017 - Stéganographie - Musical Bits ECW 2017 - Web - Path Through