Skip to content

PortSwigger · Prototype Pollution ​

Qué es ​

En JavaScript casi todos los objetos heredan de Object.prototype. Si una función mezcla datos del usuario en un objeto sin filtrar claves como __proto__, puedo añadir propiedades al prototipo y todos los objetos de la página las heredan. Si alguna de esas propiedades acaba en un sitio peligroso (un gadget, como un src de script), consigo XSS.

Labs completados ​

#LabTipo
1Client-side prototype pollution via browser APIsClient-side

Lo que me llevo ​

  1. Fuente: pruebo /?__proto__[prueba]=valor y en la consola compruebo Object.prototype.prueba → existe, el prototipo se contamina.
  2. Gadget: el código usa la propiedad transport_url de un objeto de configuración para cargar un script. Aunque el objeto la define con Object.defineProperty, no le pone value, así que la hereda del prototipo.
  3. Explotación: /?__proto__[value]=data:,alert(1); hace que se cargue mi script.

Cómo se arregla ​

  • Filtrar las claves __proto__, constructor y prototype al fusionar objetos.
  • Crear objetos con Object.create(null) o usar Map.
  • Object.freeze(Object.prototype) en el cliente.

Contenido propio con fines educativos. Sin flags ni material de exámenes.