Principe:
Exploiter une XSS sur un admin fictif pour récupérer son token de login
Infos (cf menu latéral):
🚩 Flaggué! +101 points gagnés —
💾 Téléchargez les fichiers du challenge
FCSC{14b15680de4e305b89eaa2a07b137abf4e39b5773f39a4ea7155ca5387c6f59e}
Le challenge
Le challenge est similaire à Chapristi
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 à chapristiEn 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 bonLe 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 administrateurEn 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 adminOn teste sur soi à nouveauCa marche comme attendu
Livraison à l'admin
On signale un meme au pif, histoire d'avoir la requete correspondanteOn signale alors l'URL avec notre payload XSS… 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çueJ'utilise alors un script JS perso avec plusieurs variantes de payloads: ça marche!
Usurpation
On utilise le token reçue dans notre propre navigateurEt hop, /flag est accessible, et poof, voilà le flag