Objectif :
Invoquer la fonction alert(document.cookie) en exécutant du script dans site web.
Solution :
On lance le lab et on se retrouve dans un site de commerce.
On jette un oeil au code source de la page et un bout de code Javascript nous saute aux yeux :
La page attend de recevoir des données venant de la fonction postMessage(). Ces données doivent être de forme JSON.
Ensuite, après que les données soient arrivées, une iframe est créée. Son attribut "src" est instancié si et seulement si une propriété nommée "type" de l'objet JSON vaut "load-channel" et il faut la présence d'une autre propriété nommée "url" dont l'attribut "src" de l'iframe prendra sa valeur.
À noter qu'aucune vérification n'est effectuée quant à la provenance des données.
On sait qu'il est possible d'exécuter du code Javascript à partir de cet attribut.
Il suffit maintenant d'envoyer le bon objet JSON avec les bonnes propriétés :
{"type":"load-channel","url":"javascript:alert(document.cookie)"}
Une fonctionnalité du site permet de faire exécuter du code HTML chez une victime ( il faut cliquer en haut sur "Go exploit the server" ).
Notre payload sera :
<iframe src=https://acc51f9a1e31b25c8043ef5400f70098.web-security-academy.net/ onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:alert(document.cookie)\"}","*")'>
On a rajouté des antislashs derrière les guillemets pour contourner leur filtrage.
On envoie ce payload à la victime et le lab se valide !
On peut le tester localement et on s'aperçoit bien qu'une fenêtre alert surgit.