Ahora que entendemos el JavaScript necesario, profundizaremos en la contaminación de prototipo usando el mismo ejemplo de la red social.
Prototype Pollution por sí misma no siempre presenta una amenaza explotable directamente. Sin embargo, su potencal de dañar se vuelve pronunciado cuando se une con otro tipo de vulnerabilidades como XSS y CSRF.
Un Ejemplo Común
Asumamos que tenemos un prototipo básico para Person con un método introduce. El atacante apunta a manipular el comportamiento del método introduce en todas las instancias alterando el prototipo.
//Base Prototype for Persons let personPrototype = { introduce: function() { return `Hi, I'm ${this.name}.`; } }; // Person Constructor Function function Person(name) { let person = Object.create(personPrototype); person.name = name; return person; } // Creating an instance let ben = Person('Ben');
Copia el código, cópialo en la consola y presiona enter. Cuando creamos un nuevo objeto, ben, y llamamos al método introduce, muestra Hi, I'm Ben, como se muestra en la siguiente figura.

Si un atacante inyecta contenido malicioso en el método introduce para todas las instancias usando la propiedad __proto__. En JavaScript, la propiedad __proto__ es un método común para acceder al prototipo del objeto, esencialmente apuntando al objeto desde el cual hereda las propiedades y métodos. Si el atacante consigue ejecutar el siguiente código usando cualquier vector de ataque:
// Attacker's Payload ben.__proto__.introduce=function(){console.log("You've been hacked, I'm Bob");} console.log(ben.introduce());
Veamos qué está pasando en el backgorund:
- Prototype Definition: El prototipo
Personse define inicialmente con un métodointroduceinocuo. - Object Instantiation: Una instancie de
Persones creada con el nombre'Ben' (let ben = Person('Ben');). - Prototype Pollution Attack: El atacante inyecta un payload malicioso en el método
introducedel prototipo, cambiando su comportamiento para mostrar un mensaje dañino. Hemos contaminado usando la propiedad__proto__. - Impact on Existing Instances: Como resultado, incluso la instancia ya existente (
ben) es afectada, y llamar aben.introduce()ahora muestra el mensaje del atacante.
