L'Académie du détail
Last updated
Last updated
Catégorie: Web - Difficulté: Facile
Description:
Lien : https://academie.challenges.404ctf.fr/
Solution:
Pour ce challenge de web, nous arrivons sur une page d'accueil avec un carrousel, beaucoup de mots et un espace de connexion.
Nous pouvons dans un premier temps regarder le code source de la page mais rien d'intéressant à l'intérieur. La partie qui peut être très intéréssante est celle de la page de connexion :
Pour ce connecter, il faut un nom d'utilisateur et un mot de passe (logique). On essaye tout de suite le couple admin/amin pour voir si l'administrateur du site ne serait pas trop bête. Résultat :
Nous pouvons tester avec d'autres mots de passe génériques mais toujours cette même erreur. Passons à un autre utilisateur (test ou user ou pseudo). Quand nous testons, peu importe le mot de passe donné, nous parvenons à nous connecter :
Une nouvelle page a été débloquée : "Liste des membres". Si nous souhaitons y accéder, voici le résultat que nous avons :
Le résultat n'est toujours pas convaincant... Il faut donc trouver une solution a tout ce bazar.
La partie qui nous intéresse est celle de la connexion. En regardant de plus près la requête envoyée, nous voyons que l'utilisateur et le mot de passe sont passés en paramètres :
En continuant, nous obtenons un token JWT :
Nous constatons que quoi que nous mettons dans le name et le pass de la requête POST nous parvenons à nous connecter sans soucis, sauf quand name à pour valeur admin. La dernière chose qui reste à étudier est donc ce fameux token JWT.
En allant sur jwt.io et en mettant le token récupéré, nous pouvons voir les infos remplies lors de l'envoi du formulaire de connexion :
Si nous changeons le username avec la valeur admin et que nous renvoyons le token modifié pour continuer, même erreur que précédemment... Il y a donc un autre paramètre à modifier dans ce token pour régler le souci.
En regardant les différentes vulnérabilités des tokens JWT, nous voyons que le fait de passer l'algorithme à null
dans le header était connue dans les CTF.
Nous pouvons donc faire ça. Avec jwt.io, il est compliqué de le faire alors nous allons le faire à la main avec un convertisseur en B64 :
Le payload et la signature peuvent directement être modifiés sur le site jwt.io.
Maintenant, nous disposons des 3 parties du token :
- Le header : eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0
({"alg":"none","typ":"JWT"})
- Le payload : eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjg1NjM2NjIwfQ
({"username":"admin","exp":1685636620})
- La signature : 4ZU-NSZRL2L9Pm_wgNJiSComu9tHCu5z_2apAlvmdZc
nous pouvons reconstituer le token JWT complet comme ici : eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjg1NjM2NjIwfQ.4ZU-NSZRL2L9Pm_wgNJiSComu9tHCu5z_2apAlvmdZc
Une fois le token reconstitué sur jwt.io, nous allons le changer directement au moment de la requête à l'aide du proxy de Burp Suite :
Et voilà le résultat :