
Descripción
This lab is vulnerable to DOM XSS via client-side prototype pollution. To solve the lab:
- Find a source that you can use to add arbitrary properties to the global
Object.prototype
. - Identify a gadget property that allows you to execute arbitrary JavaScript.
- Combine these to call
alert()
.
You can solve this lab manually in your browser, or use DOM Invader to help you.
DOM XSS via an alternative prototype pollution vector writeup
Este laboratorio es muy similar al anterior (DOM XSS via client-side prototype pollution). Realizaremos este laboratorio de forma manual, dividiéndolo en varios pasos:
Encontrar dónde hacer el prototype pollution
En la URL insertaremos el siguiente código (el del anterior laboratorio no funcionará):
/?__proto__.test=valortest
Para añadir al objeto __proto__ el atributo ‘test’ con el valor ‘valortest’. Si al acceder llamamos al objeto ‘Object.prototype’, veremos que lo hemos inyectado correctamente:

Encontrar qué propiedad modificar
Exploraremos el JavaScript de la página, en el archivo ‘searchLoggerAlternative.js’ existe el siguiente código:
async function searchLogger() {
window.macros = {};
window.manager = {params: $.parseParams(new URL(location)), macro(property) {
if (window.macros.hasOwnProperty(property))
return macros[property]
}};
let a = manager.sequence || 1;
manager.sequence = a + 1;
eval('if(manager && manager.sequence){ manager.macro('+manager.sequence+') }');
if(manager.params && manager.params.search) {
await logQuery('/logger', manager.params);
}
}
Este código usa eval() para ejecutar dinámicamente código JavaScript. En este caso, ejecuta con eval() la propiedad manager.macro(manager.sequence). Podemos intentar añadir código a proto.sequence para que manager.sequence la herede (dado que no está definida en la función).
Inyectar el código
Añadiremos a la URL el siguiente fragmento:
/?__proto__.sequence=alert(1)-
Nota: El ‘-‘ se añade para evitar problemas con el ‘1’ de la función:

Concatenando correctamente el valor ‘1’ y pudiendo ser ejecutado por el eval().
Al acceder a la URL completaremos el laboratorio:
