Contournement de filtres pour la prototype pollution côté serveur

Bypassing flawed input filters for server-side prototype pollution

Contexte du lab

  • Application Node.js / Express.

  • Vulnérable à la prototype pollution côté serveur car elle fusionne (merge) des données contrôlées par l’utilisateur dans un objet JavaScript côté serveur.

  • Objectif :

    1. Trouver une source de pollution permettant d’ajouter des propriétés à Object.prototype.

    2. Trouver une gadget property pour élever les privilèges.

    3. Accéder au panneau admin et supprimer l’utilisateur carlos.

  • Identifiants : wiener:peter

Point d’entrée observé

Un formulaire permet de modifier l’adresse. La requête envoie un JSON similaire à :

La réponse indique un statut du type :

  • isAdmin: false

Problème : filtre sur __proto__

L’application bloque la clé __proto__, ce qui empêche une pollution directe via cette propriété.

Bypass du filtre : chemin constructor.prototype

Au lieu d’utiliser __proto__, on passe par :

  • constructorprototype

Payload de test (preuve de concept) :

Ce payload est accepté, ce qui confirme que le filtre est contournable

Escalade : pollution de isAdmin

On remplace foo par une propriété utile pour le lab, ici isAdmin :

Le serveur l’accepte, et l’état côté application bascule : on devient administrateur

Résultat obtenu

  • Contournement du filtre sur __proto__ via constructor.prototype.

  • Ajout d’une propriété globale (Object.prototype.isAdmin = "true").

  • L’application traite ensuite l’utilisateur comme admin.

Mis à jour