Deux challenges non-liés (chapristi/gorille) n'utilisent souvent pas les mêmes failles,
donc, on peut s'attendre à tout sauf à une injection SQL
La page de flag et un token
Le site, similaire à chapristi
En cherchant dans les sources, on trouve un lien vers /flag…
… qui nous dit qu'on n'est pas admin: le cookie "token" du site n'est pas le bon
Le token ne veut rien dire, et semble aléatoire quand on ré-ouvre une navigation privée,
donc, impossible de l'attaquer directement
Signaler un meme
Le site propose une fonction pour signaler un meme à l'admin:
cette page contient une valeur "URL" qui sera surement affichée à cet administrateur
En cherchant un faux-tag HTML dans la page de recherche,
on s'aperçoit qu'une XSS (reflected) existe
Exfiltration de notre propre token
On forge alors un code JS qui va faire une requete à un C2 (requestinspector.com)
en passant le token de l'utilisateur
Tester sur soi-même, c'est toujours pratique!
Dans notre C2, on reçoit alors une requête vers une page et le (notre) token apparait
Forger le payload complet
On encode donc notre payload, qu'on va utiliser comme url à signaler à l'admin:
la XSS se déclanchera, et on devrait récupérer le token de cet admin
On teste sur soi à nouveau
Ca marche comme attendu
Livraison à l'admin
On signale un meme au pif, histoire d'avoir la requete correspondante
On signale alors l'URL avec notre payload XSS
(codes disponibles ici)
… et… quedale
Tester sur soi, c'est bien, mais cela suppose l'hypothèse "ma victime a le même navigateur que moi".
Je soupçonne que cette hypothèse soit fausse
Nouvelle livraison
Je change alors de payload, et passe par une image: ça marche (mais cela n'exfiltrera pas le token)
Un autre payload cette fois, qui chargerait un JS distant: ça marche aussi
Avec mon propre C2
Je décide alors d'utiliser une URL vers mon propre C2: ça fonctionne, la requête est reçue
J'utilise alors un script JS perso avec plusieurs variantes de payloads: ça marche!
(dispos, pour rappel, ici)
Usurpation
On utilise le token reçue dans notre propre navigateur
Et hop, /flag est accessible, et poof, voilà le flag: FCSC{14b15680de4e305b89eaa2a07b137abf4e39b5773f39a4ea7155ca5387c6f59e}