La clé qui a empoisonné la base : Prototype Pollution

Sécurité Web & API Niveau 3/4 ~5 min 26 octobre 2026

Le défi

L'endpoint de préférences de Thornfield prend n'importe quel JSON que vous postez et le fusionne dans vos paramètres avec un petit helper récursif. Le helper copie chaque clé qu'il trouve dans votre objet, en descendant dans les objets imbriqués au passage. Un nom de clé est particulier en JavaScript, et écrire à travers lui ne modifie pas votre objet : il modifie ce dont tous les objets héritent. Lisez le code et donnez le nom de la clé qu'un attaquant envoie pour définir une propriété sur tous les objets du processus en une seule fois.

Ce que tu vas apprendre

  • Expliquer comment __proto__ donne accès au prototype partagé d'un objet
  • Voir comment un merge récursif sans garde-fou écrit sur le prototype
  • Suivre une lecture de propriété avec valeur par défaut (isAdmin) qui devient true pour tous les utilisateurs
  • Nommer __proto__, constructor et prototype comme les clés à refuser
  • Énoncer les défenses : merge sûr et objets sans prototype

Compétences testées

Revue de code sourceModèle objet de JavaScriptSuivi du flux de données

Prérequis

  • Savoir lire du JavaScript
  • L'idée que les objets héritent d'un prototype

Comment ça marche

Tout objet JavaScript simple hérite d'un prototype partagé, accessible via la clé __proto__. Lire une propriété que l'objet ne définit pas renvoie à ce prototype.

Un merge récursif qui copie toutes les clés de l'entrée de l'attaquant, et qui descend dans les objets imbriqués, suivra un __proto__ imbriqué et assignera sur le prototype partagé au lieu de l'objet d'entrée. Un corps comme {"__proto__": {"isAdmin": true}} définit donc isAdmin sur le prototype dont tous les objets héritent.

Ensuite, tout objet sans isAdmin propre résout la recherche vers true. Une vérification d'authentification qui lit cette propriété par défaut passe désormais pour tout le monde.

Erreurs fréquentes

  • Répondre isAdmin. C'est la propriété qui est polluée ; la clé que le merge ne refuse pas est __proto__.
  • Répondre merge. La fonction est le vecteur, mais la question demande la clé.
  • Croire que cela ne modifie que votre objet. Écrire via __proto__ modifie le prototype partagé, ce qui touche tous les objets.
  • Supposer qu'une valeur absente par défaut est sûre. La pollution fait résoudre les propriétés absentes vers une valeur choisie par l'attaquant.

Comment s'en protéger

Refusez les clés dangereuses et évitez les lectures de sécurité basées sur une valeur par défaut.

  • Dans tout merge ou deep-assign sur des données non fiables, ignorez ou rejetez __proto__, constructor et prototype.
  • Utilisez des objets sans prototype (Object.create(null)) ou une Map pour les données indexées par des noms non fiables.
  • Préférez une bibliothèque de merge éprouvée ou structuredClone à un merge récursif maison ; dans Node, envisagez --disable-proto.
  • Ne basez pas une décision de sécurité sur une propriété simplement censée être absente par défaut.

Solution complète

Les membres Pro et Max débloquent la solution complète étape par étape.

Passer Pro

Statistiques de la communauté

135 résolutions
67% taux de réussite
Malekith Premier sang

Hacks du jour associés

35 000+ Hackers Vrais labs Gratuit
Commencer Gratuitement ou résolvez le hack du jour, sans compte