formAlity
Introduction
Sur ce site vous pourrez retrouver un sondage cinématographique. Vous pourrez aussi vous rapprocher d’un administrateur afin qu’il puisse vous générer un justificatif de présence.

Path
- Exploitation d’un JWT non vérifié
- Exploitation d’une SSTI pour avoir une RCE.
Exploitation
JWT
Lorsque l’on s’inscrit, puis que l’on se connecte, on tombe sur une
page qui nous donne notre type de compte. Ici, je suis un user.

Si on souhaite aller sur la page des justificatifs, comme demandé dans la description du challenge, on a un message d’erreur car nous n’avons pas les permissions nécessaires.

En allant sur jwt.io, on peut voir que notre role user est stocké
dans le JWT.

Si on essaie de changer uniquement que la valeur du role en le passant à admin,
eh bien je suis désormais admin.

SSTI
On a donc accès au formulaire :

Une fois le formulaire soumis, un fichier PDF nous est renvoyé avec notre nom, et notre prénom, ainsi que la date actuelle.
Si on envoie aucun des deux champs dans la requête, le PDF reçu renvoie un Nom à undefined,
ce qui réduit la possibilité du nombre de langage qui feraient tourner le site.
C’est probablement du JavaScript, mais pour en avoir le coeur net, je vais envoyer:
`${process.env}`
Ce petit bout de code va exécuter process.env en Nodejs, et devrait nous renvoyer
les variables d’environnements sous forme de String. Mais étant un objet, on devrait
avoir le retour [Object object].

Donc en effet, c’est bel et bien du JavaScript. Il ne reste plus qu’à exécuter un shell.
En Node.JS, il y a une librairie native qui s’appelle child_process,
et qui permet d’exécuter des binaires à la manière de system
en C ou en PHP.
On peut donc envoyer la payload suivante :
`${require("child_process").execSync("ls -lAR")}`

On a donc un fichier flag.txt à la racine du projet. Il ne reste plus qu’à le lire.
`${require("child_process").execSync("cat flag.txt")}`

Flag: SHLK{JwT_bYpaS5_2_RCe}