Bypass de l’authentification JWT par injection du paramètre jku
JWT authentication bypass via jku header injection
Contexte du laboratoire
Ce laboratoire utilise un mécanisme de gestion de session basé sur JWT. Le serveur prend en charge le paramètre jku dans l’en-tête du JWT, qui indique l’URL depuis laquelle récupérer la clé publique (JWK) utilisée pour vérifier la signature.
La vulnérabilité provient du fait que le serveur ne vérifie pas si l’URL fournie dans jku appartient à un domaine de confiance. Il est donc possible de forcer le serveur à récupérer une clé publique contrôlée par l’attaquant.
Objectif :
Forger un JWT permettant l’accès au panneau d’administration
/adminSupprimer l’utilisateur carlos
Identifiants fournis :
wiener : peter
JWT initial
Un JWT valide est récupéré après authentification avec l’utilisateur wiener :
Modification de l’en-tête JWT
L’attaque consiste à ajouter le paramètre jku dans l’en-tête afin d’indiquer une URL publique hébergée sur l’Exploit Server, qui servira une clé JWK contrôlée.
En-tête modifié :
Génération d’une paire de clés RSA
Une nouvelle paire de clés RSA est générée côté attaquant.

La clé publique est convertie au format JWK afin d’être servie par l’Exploit Server.

Contenu du JWK public :
Hébergement du JWK sur l’Exploit Server
Le JWK est exposé sous la forme d’un ensemble de clés, comme attendu par le serveur cible :

En-tête final du JWT
Le champ kid est mis à jour pour correspondre à celui du JWK hébergé, et le jku pointe vers l’URL exacte du fichier exposé :

Signature et élévation de privilèges
Le JWT est signé avec la clé privée correspondant à la clé publique exposée.

La charge utile est modifiée pour usurper un utilisateur administrateur :
JWT final :

Mis à jour