DOM XSS via un vecteur alternatif de prototype pollution

DOM XSS via an alternative prototype pollution vector

Contexte du lab

L’application exécute du JavaScript côté navigateur et construit certains objets à partir des paramètres d’URL. Le but est de polluer Object.prototype (donc d’injecter une propriété qui sera héritée par d’autres objets), puis de trouver un “gadget” dans le code qui réutilise cette propriété d’une façon dangereuse (ici via eval), afin d’exécuter alert().

Analyse de la source de pollution

Test initial (non fonctionnel)

Le premier test consiste à injecter une propriété via l’URL :

Après vérification dans la console :

Le résultat est undefined, et aucune propriété n’apparaît dans Object.prototype.

Conclusion : le parseur de paramètres utilisé par l’application ne traite pas la notation avec crochets pour __proto__.

Vecteur alternatif fonctionnel

En utilisant une notation avec un point :

Cette fois-ci :

Retourne bien bar.

La pollution de Object.prototype fonctionne avec ce format, ce qui indique que le parseur accepte la notation __proto__.clé.

Identification du gadget

Le fichier searchLoggerAlternative.js contient le code suivant :

Points clés :

  • manager.sequence peut être hérité depuis Object.prototype.

  • Sa valeur est intégrée directement dans une chaîne passée à eval().

  • Aucune validation n’est effectuée sur le type ou le contenu.

eval() constitue donc un gadget exploitable.

Exploitation

On pollue la propriété sequence sur le prototype global :

Déroulement :

  • manager.sequence récupère la valeur polluée depuis Object.prototype.

  • L’opération a + 1 transforme la chaîne en alert(1) -1.

  • Cette valeur est injectée dans la chaîne exécutée par eval().

Résultat :

  • alert(1) est exécuté au chargement de la page.

  • Le DOM XSS est déclenché avec succès.

Mis à jour