Ahora que entendemos el JavaScript necesario, profundizaremos en la contaminación de prototipo usando el mismo ejemplo de la red social.

IMPORTANT

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.

javascript
//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.

How it Works

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:

javascript
// 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 Person se define inicialmente con un método introduce inocuo.
  • Object Instantiation: Una instancie de Person es creada con el nombre 'Ben' (let ben = Person('Ben');).
  • Prototype Pollution Attack: El atacante inyecta un payload malicioso en el método introduce del 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 a ben.introduce() ahora muestra el mensaje del atacante.