DOM XSS via an alternative prototype pollution vector writeup

Descripción

This lab is vulnerable to DOM XSS via client-side prototype pollution. To solve the lab:

  1. Find a source that you can use to add arbitrary properties to the global Object.prototype.
  2. Identify a gadget property that allows you to execute arbitrary JavaScript.
  3. 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:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *