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

# Explotación de vulnerabilidades sensibles al tiempo

### Explotación de vulnerabilidades sensibles al tiempo

### Contexto del laboratorio

El sitio ofrece una función de **Restablecimiento de contraseña** a través de un enlace enviado por correo electrónico. / No hay una verdadera condición de carrera en el lado lógico de la aplicación, pero la generación de **tokens** es **basado**: depende de un **valor predecible** (tiempo), lo que permite forjar un token válido para otro usuario enviando solicitudes \*\* al mismo tiempo\*\*.

<figure><img src="/files/3361ea3f52ea50fd4ccc438f014e7a1dd060c492" alt=""><figcaption></figcaption></figure>

### Observaciones iniciales

1. Usamos **Olvidé mi contraseña** con el usuario `wiener`.

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

* Un correo electrónico que contiene un enlace del tipo:
* `/forgot-password?user=wiener&token=<token>`

{% code overflow="wrap" %}

```bash
¡Hola!

Por favor, sigue el siguiente enlace para restablecer tu contraseña.

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

{% endcode %}

<figure><img src="/files/77a4a49cb2e14521fdee0b0c72cf3804e91c7649" alt=""><figcaption></figcaption></figure>

* El token parece ser un **SHA1** (40 caracteres hexadecimales).

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

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

* El token parece ser un **SHA1** (40 caracteres hexadecimales).

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

<figure><img src="/files/0a8c5b843614f0fd9ea69a46b37d3928f5431577" alt=""><figcaption></figcaption></figure>

1. Al generar varios tokens

Suposición: el token se deriva principalmente de un **marca de tiempo** (o un valor basado en el tiempo), en lugar de un secreto sólido.

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

### Idea clave: forzar dos solicitudes en el mismo milisegundo

Si podemos provocar **dos restablecimientos** al mismo tiempo, y el token depende solo del momento, entonces **los dos tokens serán idénticos**.

<figure><img src="/files/65abb7021a835d5c276aac1e13647aa44cfacc08" alt=""><figcaption></figcaption></figure>

Problema: el servidor (PHP) a veces evita colisiones con la misma sesión / CSRF. / Solución: obtener **dos sesiones separadas**.

<figure><img src="/files/40f159ffcec08dfcfd57c5c508f1ab2011d368cb" alt=""><figcaption></figcaption></figure>

### Preparación: obtener dos pares de sesión + CSRF

Se realizan dos solicitudes separadas a:

* `GET /forgot-password`

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

Cada respuesta da un nuevo par:

* `PHPSESSID=<...>`
* un nuevo token CSRF (valor oculto en el formulario)

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

Hay **dos solicitudes listas**, cada una con:

* su `PHPSESSID` cookie
* su campo CSRF asociado

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

### Disparador: envío en paralelo

Luego enviamos **en paralelo** dos POST de restablecimiento (mismo endpoint), en Burp (agrupar + enviar en paralelo), para que lleguen **en la misma ventana de tiempo**.

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

Resultado observado: los dos correos electrónicos recibidos contienen \*\*exactamente el mismo token\*\*:

```bash
933ccbd314dc37df95887cd914b07e330517f7bb
933ccbd314dc37df95887cd914b07e330517f7bb
```

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

Conclusión: el token depende esencialmente de **marca de tiempo**, no de un único secreto por usuario.

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

### Operación: restablecimiento de Carlos con el token de Wiener

Objetivo: token válido para `carlos`.

Método:

1. Lanzar en paralelo dos restablecimientos:

* uno para `wiener`
* uno para `carlos`

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

Como los tokens son idénticos, el token recibido (p. ej., por `wiener` correo electrónico) también será válido para `carlos`.

Si el sitio acepta esta URL, puedes **establecer una nueva contraseña** para `carlos`.

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

### Finalización del laboratorio

1. Inicia sesión como `carlos` con la nueva contraseña.
2. Accede al \*\*panel de administrador\*\*.
3. Elimina al `carlos` usuario para validar el laboratorio.

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