> 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/race-conditions/exploitation-of-time-sensitive-vulnerabilities.md).

# Ausnutzung zeitkritischer Schwachstellen

### Ausnutzung zeitkritischer Schwachstellen

### Laborkontext

Die Website bietet eine Funktion zum **Passwort zurücksetzen** über einen per E-Mail gesendeten Link. / Auf der logischen Anwendungsseite gibt es keine echte Race Condition, aber die Generierung von **Token** ist **basiert**: es hängt von einem **vorhersehbaren Wert** (Zeit), was es ermöglicht, durch das gleichzeitige Senden von Anfragen \*\* ein gültiges Token für einen anderen Benutzer zu fälschen\*\*.

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

### Erste Beobachtungen

1. Wir verwenden **Passwort vergessen** mit Benutzer `wiener`.

<figure><img src="/files/4f8f2d5f89235383e6850d7cb278dbaf1e3a87f0" alt=""><figcaption></figcaption></figure>

* Eine E-Mail mit einem Link der Art:
* `/forgot-password?user=wiener&token=<token>`

{% code overflow="wrap" %}

```bash
Hallo!

Bitte folgen Sie dem folgenden Link, um Ihr Passwort zurückzusetzen.

https://0a1300c9040343bf810b7f2a00e60085.web-security-academy.net/forgot-password?user=wiener&token=3930dc6d3d076151204ad4147326f81a5e1609a8
```

{% endcode %}

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

* Das Token sieht aus wie ein **SHA1** (40 hexadezimale Zeichen).

`forgot-password?user=wiener&token=3930dc6d3d076151204ad4147326f81a5e1609a8`

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

* Das Token sieht aus wie ein **SHA1** (40 hexadezimale Zeichen).

```bash
hashid '3930dc6d3d076151204ad4147326f81a5e1609a8'
```

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

1. Durch das Generieren mehrerer Token

Annahme: Das Token wird hauptsächlich aus einem **Zeitstempel** (oder einem zeitbasierten Wert) statt aus einem robusten Geheimnis.

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

### Kernidee: Zwei Anfragen zur selben Millisekunde erzwingen

Wenn wir auslösen können **zwei Zurücksetzungen** zur selben Zeit, und das Token nur von der Zeit abhängt, dann **werden die beiden Token identisch sein**.

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

Problem: Der Server (PHP) vermeidet manchmal Kollisionen bei derselben Sitzung / demselben CSRF. / Lösung: hole **zwei separate Sitzungen**.

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

### Vorbereitung: Zwei Session- + CSRF-Paare besorgen

Es werden zwei separate Anfragen an folgende Adresse gesendet:

* `GET /forgot-password`

```http
GET /forgot-password HTTP/2
Host: 0a1300c9040343bf810b7f2a00e60085.web-security-academy.net
Cookie:
```

Jede Antwort liefert ein neues Paar:

* `PHPSESSID=<...>`
* ein neues CSRF-Token (Wert im Formular verborgen)

<figure><img src="/files/9942f4f5244896b60a224999423f25de66c50651" alt=""><figcaption></figcaption></figure>

Es gibt **zwei vorbereitete Anfragen**, jeweils mit:

* seinem `PHPSESSID` Cookie
* dem zugehörigen CSRF-Feld

<figure><img src="/files/65782d1d8fb5ae20ed3c4f9cd57bd02a58f1ca08" alt=""><figcaption></figcaption></figure>

### Auslösen: Parallel senden

Dann senden wir **parallel** zwei POST-Resets (derselbe Endpunkt) in Burp (gruppieren + parallel senden), sodass sie ankommen **im selben Zeitfenster**.

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

Beobachtetes Ergebnis: Die beiden empfangenen E-Mails enthalten \*\*genau dasselbe Token\*\*:

```bash
933ccbd314dc37df95887cd914b07e330517f7bb
933ccbd314dc37df95887cd914b07e330517f7bb
```

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

Fazit: Das Token hängt im Wesentlichen von **Zeitstempel**, nicht von einem einzelnen Geheimnis pro Benutzer.

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

### Vorgehen: Carlos-Reset mit Wieners Token

Ziel: Token gültig für `carlos`.

Methode:

1. Starte parallel zwei Zurücksetzungen:

* eine für `wiener`
* eine für `carlos`

```bash
forgot-password?user=wiener&token=da1d6e3ed67bef3efa9fe74fcfbf7603120ea744
forgot-password?user=carlos&token=da1d6e3ed67bef3efa9fe74fcfbf7603120ea744
```

Da die Token identisch sind, ist das empfangene Token (z. B. per `wiener` E-Mail) auch gültig für `carlos`.

Wenn die Website diese URL akzeptiert, können Sie **ein neues Passwort festlegen** für `carlos`.

<figure><img src="/files/22cbc474bb0d1f1861b2857a842b848f5819caa4" alt=""><figcaption></figcaption></figure>

### Abschluss des Labs

1. Anmelden als `carlos` mit dem neuen Passwort.
2. Rufen Sie die \*\*Admin-Anmeldung\*\* auf.
3. Entfernen Sie den `carlos` Benutzer, um das Lab zu validieren.

<figure><img src="/files/c58c7a5451cc9f752980cec73759752d838d54dd" 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/race-conditions/exploitation-of-time-sensitive-vulnerabilities.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.
