Web Security Academy

Cross-site scripting - Lab : DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded

Objectif :

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

Solution :

On démarre le lab et on se trouve dans un blog avec une barre de recherche disponible.

On regarde le code source :

On constate que le Framework AngularJs est utilisé ( la version 1.7.7 ) et que dans le tag <body>, l'attribut ng-app est inscrit. Cela signifie que l'on peut utiliser dans le body des expressions AngularJs.

On peut aussi noter que dans cette version de AngularJs, une sandbox liée à ces expressions, présente dans les versions antérieures a été retirée.

Lorsqu'on recherche une chaîne de caractères par la barre de recherche, on s'aperçoit qu'elle est directement écrite à l'intérieur du body de la page.

On va donc essayer d'exécuter du script par cette entrée avec les expressions AngularJS.

Un chercheur en sécurité Web se nommant Mario Heiderich a trouvé le moyen de le faire dans le contexte où la sandbox n'est pas activée ( ce qui est notre cas ) en trouvant ce payload : {{constructor.constructor('alert(1)')()}}.

La fonction constructor de l'objet constructor permet de générer une fonction à partir d'une chaîne et donc d'exécuter du code arbitraire.

Ce payload ne contient aucun guillemet ni des chevrons, qui sont encodés au moment du traitement de l'entrée dans la barre de recherche.

On soumet cette expression AngularJS au serveur, et une fenêtre apparaît :

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