Injection d'en-tête JWT KID
| Gravité | Élevée |
|---|---|
| Classifications | CWE-345: Insufficient Verification of Data Authenticity |
| Catégorie OWASP | OWASP 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
kidavec un chemin du système de fichiers tel que/dev/nullpour que le serveur lise un fichier vide comme clé, ce qui peut correspondre à un secret HMAC vide.
Exemple
Section titled “Exemple”Voici un JWT valide signé avec HS256 :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cVariante par injection SQL
Section titled “Variante par injection SQL”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"}Variante par traversée de chemin
Section titled “Variante par traversée de chemin”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"}Comment tester ?
Section titled “Comment tester ?”vulnapi scan curl [url] -H "Authorization: Bearer eyJhbGciOiJIUzI1NiI..." --scans jwt.kid_injectionecho "eyJhbGciOiJIUzI1NiI..." | vulnapi scan openapi [OpenAPI_Path_Or_URL] --scans jwt.kid_injectionvulnapi scan graphql -H "Authorization: Bearer eyJhbGciOiJIUzI1NiI..." --scans jwt.kid_injection [url]VulnAPI prend aussi en charge le scan d’autres types de vulnérabilités.
Quel est l’impact ?
Section titled “Quel est l’impact ?”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.
Comment corriger ?
Section titled “Comment corriger ?”- Valider la valeur
kidavant 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
kiddans 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
kidque comme identifiant opaque associé côté serveur à une clé connue. - Coder en dur ou mettre en liste blanche les valeurs
kidautorisées lorsque c’est possible.