XSS DOM via prototype pollution côté client

DOM XSS via client-side prototype pollution

Contexte du lab

L’application est vulnérable à une XSS DOM déclenchée grâce à une pollution du prototype (client-side). Objectif : polluer Object.prototype avec une propriété utile, trouver un gadget dans le JS qui l’exploite, puis exécuter alert().

1) Observation de la pollution du prototype

Source de pollution (dans l’URL)

On peut injecter des propriétés dans __proto__ via les paramètres :

Vérification dans la console

Après la navigation, on vérifie que la propriété “fuit” dans tous les objets :

2) Code vulnérable côté client

Le site contient une logique de “search logger” :

Point clé : le code lit config.transport_url et l’utilise comme source d’un <script>.

3) Gadget exploitable identifié

Gadget

  • config.transport_url

Pourquoi c’est dangereux

Si transport_url existe (même via le prototype), le script fait :

  • création d’un <script>

  • script.src = config.transport_url

  • insertion dans le DOM

Donc on peut forcer le navigateur à charger un script depuis une URL contrôlée.

4) Exploitation : déclencher la XSS

Payload (pollution + exécution)

On pollue Object.prototype.transport_url avec une URL data: qui exécute alert(1) :

Effet côté DOM

Le code finit par générer quelque chose équivalent à :

Mis à jour