Web Security Academy

Cross-site scripting - Lab : Stored DOM XSS

Objectif :

  • Invoquer la fonction alert() ( en Javascript ) en exécutant du script dans site web.

Solution :

On lance le lab et on se retrouve dans un blog avec une barre de recherche disponible :

On accède au détail d'une publication et on regarde le code source :

Un fichier Javascript est exécuté. On clique sur celui-ci pour le lire :

Sur ce bout de code, on aperçoit qu'une requête GET est envoyée au serveur avec comme URL /post/comment avec comme paramètre le numéro du post en question ( on peut le voir en analysant la requête avec un outil approprié comme Burp Suite ).

Si elle est bien réceptionnée et qu'il n'y a pas d'indication d'erreurs dans la réponse du serveur, les données reçues sont traitées et affichées sur la page. Ici, les données sont les commentaires associés au post.

En regardant plus loin dans le code, on constate que le nom de l'auteur d'un commentaire est affiché avec l'utilisation de la propriété innerHTML de la balise en question :

On sait que l'on peut injecter du script dans cette propriété. Une fonction se nommant escapeHTML est utilisé avant l'affichage des données :

Elle encode les caractères chevrons ( "<" et ">" ). La fonction replace() est mal utilisée : elle ne s'exécute que sur la première occurrence du caractère précisé.

Notre payload sera donc : <><img src=1 onerror=alert(1)>

Il suffit de soumettre un commentaire en inscrivant cette chaîne en tant que nom de l'auteur du commentaire.

On recharge la page et une fenêtre surgit :

Le script s'est exécuté et le lab est désormais validé !