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 /admin

  • Supprimer 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