Bypass de l’authentification JWT par injection de JWK

JWT authentication bypass via jwk header injection

Description du laboratoire

Ce laboratoire utilise un mécanisme d’authentification basé sur des JWT pour gérer les sessions. Le serveur accepte le paramètre jwk dans l’en-tête du JWT, ce qui permet d’embarquer directement la clé publique utilisée pour la vérification de la signature.

Cependant, l’implémentation est vulnérable : le serveur ne vérifie pas si la clé JWK fournie provient d’une source fiable. Il est donc possible de forger un token signé avec sa propre paire de clés.

Objectif du laboratoire :

  • Obtenir un accès au panneau d’administration /admin

  • Supprimer l’utilisateur carlos

Identifiants fournis :

  • wiener:peter

Analyse du JWT initial

Le JWT fourni utilise l’algorithme RS256, ce qui indique une signature asymétrique (clé privée pour signer, clé publique pour vérifier).

En-tête (extrait) :

  • alg: RS256

  • kid: identifiant de clé

Payload :

  • sub: wiener

  • iss: portswigger

  • exp: timestamp d’expiration

Génération d’une nouvelle paire de clés RSA

À l’aide de JWT Editor, une nouvelle clé RSA est générée. Cette clé contient notamment :

  • n (modulus)

  • e (exponent)

  • d, p, q, etc.

  • un nouveau kid

Cette paire de clés est entièrement contrôlée par l’attaquant.

Modification du payload

Le champ sub est modifié afin d’usurper l’identité de l’administrateur :

Injection du JWK dans l’en-tête

Dans l’en-tête du JWT, un champ jwk est ajouté.

Il contient la clé publique RSA correspondant à la clé privée utilisée pour signer le token.

Ainsi, le JWT :

  • déclare sa propre clé de vérification,

  • est signé avec la clé privée associée,

  • et reste cohérent du point de vue cryptographique.

Le serveur accepte cette clé sans vérifier son origine.

Signature du token

Le JWT est signé avec la clé privée générée précédemment. La signature est donc valide selon la clé JWK embarquée dans l’en-tête.

Résultat

Le serveur accepte le JWT forgé. L’accès au panneau /admin est accordé avec les privilèges administrateur.

L’utilisateur carlos peut alors être supprimé, ce qui valide le laboratoire

Mis à jour