Web Security Academy

Cross-site scripting - Lab : DOM XSS in document.write sink using source location.search inside a select element

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 site de commerce avec des articles en vente.

On accède au détail d'un article et en bas de la page, on peut vérifier la quantité de stock disponible dans certaines villes :

On regarde le code source et une partie semble intéressante :

Ce code Javascript nous indique comment la liste des villes est générée sur la page.

En jetant un coup d'oeil au DOM de la page avec les outils du navigateur, on peut voir le code HTML produit par le code Javascript précédent :

On sait aussi grâce au code source qu'en définissant certains paramètres dans la requête GET permettant d'accéder au détail d'un produit, on peut ajouter n'importe quel nom de ville dans la liste comme l'illustrent les images suivantes :

On a désormais tous les éléments pour effectuer notre attaque.

La DOM XSS va se faire grâce à la fonction document.write dont on a en partie le contrôle à partir du paramètre de requête "storeId".

Le code qui sera injecté devra être syntaxiquement en harmonie avec ce qu'il l'entoure sinon il risque de ne pas s'exécuter.

On peut par exemple écrire ceci comme payload :

<select name="storeId"><option selected> blabla</option></select><script>alert(1)</script><select name="storeId2"><option>etOUey

On le soumet au serveur et une fenêtre apparaît :

Le script a été exécuté. On peut encore une fois jeter un regard sur le DOM de la page pour s'en rendre compte des changements :

Le lab est désormais résolu !