Aller au contenu

Injection d'en-tête JWT KID

GravitéÉlevée
ClassificationsCWE-345: Insufficient Verification of Data Authenticity
Catégorie OWASPOWASP API2:2023 Broken Authentication

Le champ d’en-tête JWT kid (Key ID) est censé indiquer au serveur quelle clé utiliser pour la vérification de la signature. Lorsque cette valeur est transmise sans désinfection à une requête de base de données ou une recherche sur le système de fichiers, les attaquants peuvent injecter un payload amenant le serveur à utiliser une clé contrôlée par l’attaquant, leur permettant ainsi de forger des tokens arbitraires.

Pour plus de détails, consultez la documentation jwtop sur l’injection d’en-tête KID.

VulnAPI teste deux variantes de cette attaque :

  • Injection SQL — injecte un payload SQL dans kid (ex. ' UNION SELECT 'secret' ...) pour que la base de données renvoie une valeur connue en tant que clé.
  • Traversée de chemin — définit kid avec un chemin du système de fichiers tel que /dev/null pour que le serveur lise un fichier vide comme clé, ce qui peut correspondre à un secret HMAC vide.

Voici un JWT valide signé avec HS256 :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

L’attaquant fabrique un token avec un en-tête kid qui s’injecte dans la requête de recherche de clé et le re-signe avec la valeur que la requête est censée renvoyer (secret) :

{
"alg": "HS256",
"typ": "JWT",
"kid": "' UNION SELECT 'secret' FROM tokens WHERE '1'='1"
}

L’attaquant définit kid sur /dev/null et re-signe le token avec un secret HMAC vide. Si le serveur lit la clé de signature depuis le chemin indiqué par kid, il reçoit zéro octet :

{
"alg": "HS256",
"typ": "JWT",
"kid": "/dev/null"
}
Terminal window
vulnapi scan curl [url] -H "Authorization: Bearer eyJhbGciOiJIUzI1NiI..." --scans jwt.kid_injection

VulnAPI prend aussi en charge le scan d’autres types de vulnérabilités.

Une attaque par injection KID réussie permet à un attaquant de forger un JWT que le serveur accepte comme légitime. Cela peut mener à un contournement complet de l’authentification, une élévation de privilèges, ou l’usurpation de l’identité de n’importe quel utilisateur du système.

  • Valider la valeur kid avant de l’utiliser — rejeter les valeurs contenant des métacaractères SQL, des séparateurs de chemin, ou des caractères en dehors d’une liste blanche sûre (ex. alphanumérique et tirets uniquement).
  • Utiliser des requêtes paramétrées lors de la recherche de clés par kid dans une base de données pour prévenir l’injection SQL.
  • Ne jamais lire le matériel de clé depuis des chemins de fichiers contrôlés par l’utilisateur — stockez les clés dans un coffre-fort sécurisé et n’utilisez kid que comme identifiant opaque associé côté serveur à une clé connue.
  • Coder en dur ou mettre en liste blanche les valeurs kid autorisées lorsque c’est possible.