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
| # | Lab | Tipo |
|---|---|---|
| 1 | Client-side prototype pollution via browser APIs | Client-side |
Lo que me llevo
- Fuente: pruebo
/?__proto__[prueba]=valory en la consola comprueboObject.prototype.prueba→ existe, el prototipo se contamina. - Gadget: el código usa la propiedad
transport_urlde un objeto de configuración para cargar un script. Aunque el objeto la define conObject.defineProperty, no le ponevalue, así que la hereda del prototipo. - Explotación:
/?__proto__[value]=data:,alert(1);hace que se cargue mi script.
Cómo se arregla
- Filtrar las claves
__proto__,constructoryprototypeal fusionar objetos. - Crear objetos con
Object.create(null)o usarMap. Object.freeze(Object.prototype)en el cliente.
