Détection sans reflet de propriétés modifiées

Detecting server-side prototype pollution without polluted property reflection

Contexte du lab

Ce lab tourne sur Node.js avec Express. Il est vulnérable à une pollution de prototype côté serveur car l’application fusionne (merge) de manière non sûre des données contrôlées par l’utilisateur dans un objet JavaScript côté serveur.

Objectif : confirmer la vulnérabilité en polluant Object.prototype de façon visible mais non destructive, uniquement via un changement de comportement du serveur (pas besoin d’exploiter plus loin).

Identifiants : wiener:peter.

Données envoyées par l’application (adresse)

En modifiant Billing / Delivery address, on observe que le navigateur envoie un JSON similaire à :

Générer une erreur contrôlée pour observer la réponse

Si on force une erreur de parsing JSON (par exemple en supprimant un guillemet), on obtient une réponse 400 et le serveur renvoie un objet d’erreur où le body contient notre payload (reflet) :

Réponse typique :

Idée : prouver la pollution sans “reflet” direct

Plutôt que d’attendre de voir une propriété polluée renvoyée dans le body, on peut viser un changement de comportement mesurable, par exemple le code HTTP renvoyé lors d’une erreur.

Ici, le serveur utilise (ou propage) des champs comme status / statusCode. Si on arrive à polluer Object.prototype.status, alors lors des erreurs futures, Express (ou le handler d’erreur) peut récupérer cette valeur via l’héritage de prototype → le serveur renverra un status différent.

Tentative de pollution via __proto__

On injecte une clé __proto__ dans le JSON (dans une requête “valide” côté JSON, pas une requête cassée), par exemple :

Effet attendu : après cette pollution, toute erreur (par exemple une erreur de parsing JSON volontaire) peut désormais répondre avec 405 au lieu de 400, car status est hérité depuis Object.prototype.

Résultat / validation

  • Avant pollution : erreurs → 400

  • Après pollution : erreurs → 405 (ou autre code choisi)

Mis à jour