Escalade de privilèges par prototype pollution côté serveur

Privilege escalation via server-side prototype pollution

Contexte du lab

L’application (Node.js + Express) fusionne (“merge”) un objet JSON contrôlé par l’utilisateur dans un objet JavaScript côté serveur, sans filtrer des clés dangereuses comme __proto__. Résultat : on peut polluer Object.prototype et injecter des propriétés qui seront héritées par d’autres objets.

Dans ce lab, c’est facile à repérer car les propriétés héritées via la chaîne de prototype réapparaissent dans la réponse HTTP.

1) Point d’entrée (source) : requête JSON de mise à jour d’adresse

Analyse de la requête

Lors de la mise à jour de l’adresse utilisateur, l’application envoie en arrière-plan la requête JSON suivante :

La réponse du serveur contient les informations utilisateur, y compris le champ sensible :

Identification de la vulnérabilité

En ajoutant une clé spéciale __proto__ dans le corps JSON :

on observe que la réponse du serveur reflète la propriété foo.

Cela confirme que :

  • Le serveur fusionne directement l’objet utilisateur

  • La pollution du prototype global (Object.prototype) est possible

  • Les propriétés héritées sont visibles et exploitées

Exploitation : élévation de privilèges

La propriété intéressante ici est isAdmin, utilisée par l’application pour déterminer les privilèges.

On injecte donc cette propriété dans le prototype global :

Résultat

  • La propriété isAdmin est désormais héritée depuis Object.prototype

  • Lors des contrôles d’autorisation, l’application considère l’utilisateur comme administrateur

  • Accès au panneau /admin

Mis à jour