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

# Exploitation de vulnérabilités sensibles au temps

### Exploitation des vulnérabilités sensibles au temps

### Contexte du laboratoire

Le site propose une fonctionnalité de **Réinitialisation du mot de passe** via un lien envoyé par e-mail. / Il n'y a pas de véritable condition de course du côté logique de l'application, mais la génération de **jetons** est **basés**: cela dépend d'une **valeur prévisible** (temps), ce qui permet de forger un jeton valide pour un autre utilisateur en envoyant des requêtes \*\* au même moment\*\*.

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

### Observations initiales

1. Nous utilisons **Mot de passe oublié** avec l'utilisateur `wiener`.

<figure><img src="/files/8978ed33da399285b0c628cd6bd9cae075db4a2c" alt=""><figcaption></figcaption></figure>

* Un e-mail contenant un lien du type :
* `/forgot-password?user=wiener&token=<token>`

{% code overflow="wrap" %}

```bash
Bonjour !

Veuillez suivre le lien ci-dessous pour réinitialiser votre mot de passe.

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

{% endcode %}

<figure><img src="/files/2119981533467bc94a23dda09a60ae76602a78e7" alt=""><figcaption></figcaption></figure>

* Le jeton ressemble à un **SHA1** (40 caractères hexadécimaux).

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

<figure><img src="/files/7618b0c6b839433ceaa3f68c02516e97d3394f45" alt=""><figcaption></figcaption></figure>

* Le jeton ressemble à un **SHA1** (40 caractères hexadécimaux).

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

<figure><img src="/files/574d8445ff931eb74ffa44f70d31047627a14682" alt=""><figcaption></figcaption></figure>

1. En générant plusieurs jetons

Hypothèse : le jeton est dérivé principalement d'un **horodatage** (ou d'une valeur basée sur le temps), plutôt que d'un secret robuste.

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

### Idée clé : forcer deux requêtes dans la même milliseconde

Si nous pouvons déclencher **deux réinitialisations** en même temps, et si le jeton dépend uniquement du moment, alors **les deux jetons seront identiques**.

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

Problème : le serveur (PHP) évite parfois les collisions avec la même session / CSRF. / Solution : obtenir **deux sessions distinctes**.

<figure><img src="/files/2e67f35a9e10b6371992f9b810ba556be67eb204" alt=""><figcaption></figcaption></figure>

### Préparation : obtenir deux couples session + CSRF

Deux requêtes distinctes sont envoyées à :

* `GET /forgot-password`

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

Chaque réponse donne un nouveau couple :

* `PHPSESSID=<...>`
* un nouveau jeton CSRF (valeur cachée dans le formulaire)

<figure><img src="/files/206e28f621a9cfd932b396c5b7643a1c2ab77353" alt=""><figcaption></figcaption></figure>

Il y a **deux requêtes prêtes**, chacune avec :

* son `PHPSESSID` cookie
* son champ CSRF associé

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

### Déclenchement : envoi en parallèle

Puis nous envoyons **en parallèle** deux requêtes POST de réinitialisation (même endpoint), dans Burp (grouper + envoyer en parallèle), afin qu'elles arrivent **dans la même fenêtre temporelle**.

<figure><img src="/files/5566c73b42efa34f3e77f1db230209dddd1fcb47" alt=""><figcaption></figcaption></figure>

Résultat observé : les deux e-mails reçus contiennent \*\* exactement le même jeton\*\* :

```bash
933ccbd314dc37df95887cd914b07e330517f7bb
933ccbd314dc37df95887cd914b07e330517f7bb
```

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

Conclusion : le jeton dépend essentiellement de **horodatage**, et non d'un secret unique par utilisateur.

<figure><img src="/files/10769a52730922463c98d4e0238b2c33ac27ad40" alt=""><figcaption></figcaption></figure>

### Opération : réinitialisation de Carlos avec le jeton de Wiener

Objectif : jeton valide pour `carlos`.

Méthode :

1. Lancer en parallèle deux réinitialisations :

* une pour `wiener`
* une pour `carlos`

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

Puisque les jetons sont identiques, le jeton reçu (par ex. via `wiener` e-mail) sera également valide pour `carlos`.

Si le site accepte cette URL, vous pouvez **définir un nouveau mot de passe** pour `carlos`.

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

### Fin du labo

1. Se connecter en tant que `carlos` avec le nouveau mot de passe.
2. Accédez à la \*\*connexion admin\*\*.
3. Supprimez le `carlos` utilisateur pour valider le laboratoire.

<figure><img src="/files/d2aa9852c7ffdf7b675deeb11ca9af04d8310aaa" 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/fr/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.
