Bypass d’authentification JWT via path traversal dans kid

JWT authentication bypass via kid header path traversal

Contexte du lab

L’application utilise des JWT pour gérer les sessions. Pour vérifier la signature, le serveur lit l’en-tête du JWT et récupère la clé de vérification depuis le système de fichiers en se basant sur la valeur du champ kid (Key ID). Problème : la valeur de kid n’est pas correctement validée, ce qui permet un path traversal afin de pointer vers un fichier arbitraire du système.

Objectif : forger un JWT donnant accès à /admin, puis supprimer l’utilisateur carlos.

Point de départ

Après connexion avec wiener:peter, on récupère un JWT valide :

  • Header : alg = HS256, kid = <uuid>

  • Payload : sub = wiener

Idée de l’attaque

Comme kid sert de chemin pour charger la clé, on peut tenter de le faire sortir du répertoire attendu avec ../ afin de viser un fichier spécial : /dev/null.

  • /dev/null se comporte comme un fichier “vide”.

  • Si le serveur charge la “clé” depuis ce fichier, il se retrouve (dans ce scénario) à vérifier la signature avec une clé équivalente à nul / vide.

Construction d’une clé symétrique “nulle”

Tu génères un octet nul et tu l’encode en Base64 :

  • Commande :

Puis tu construis un JWK de type symétrique (kty: oct) dont la clé (k) est AA== :

(Le kid du JWK ici sert juste d’identifiant côté outil ; l’important, c’est la valeur k.)

Exploitation : kid en traversal vers /dev/null

Tu modifies ensuite l’en-tête du JWT pour faire pointer kid vers /dev/null via traversal :

Puis tu changes le sub dans le payload pour te faire passer pour un compte admin (dans ton cas administrator) et tu signes le JWT en HS256 avec la clé “nulle” (AA==).

Résultat

JWT final forgé (celui que tu fournis) :

  • kid traverse jusqu’à /dev/null

  • alg reste HS256

  • sub devient administrator

Le serveur accepte le token : ça confirme que la résolution de kid est exploitable et que la vérification de signature se fait avec une clé dérivée du fichier ciblé (ici “vide”).

Mis à jour