Aller au contenu

Secret JWT faible

GravitéÉlevée
CVE
Classifications
Schéma d’attaqueCAPEC-16: Dictionary-based Password Attack
Catégorie OWASPOWASP API2:2023 Broken Authentication

Une vulnérabilité survient lorsqu’un JSON Web Token (JWT) est signé avec un secret courant, connu, ou faible. Dans ce cas, le token n’a aucune protection cryptographique réelle et devient manipulable. Les attaquants peuvent retrouver le secret puis modifier les claims et le contenu du token sans être détectés, ce qui peut mener à un accès non autorisé et à une falsification des données.

  • Secret courant : la clé secrète utilisée pour signer le JWT est une valeur courante, telle que secret, password, ou 123456. Les attaquants peuvent facilement deviner la clé secrète par force brute.
  • Secret connu : la clé secrète utilisée pour signer le JWT est une valeur connue ou une valeur par défaut. Cela peut arriver lorsque vous utilisez une clé secrète par défaut fournie par un produit, une bibliothèque, ou un framework. Les attaquants peuvent trouver la clé secrète dans des dépôts publics, des forums, ou de la documentation.
  • Secret faible : la clé secrète utilisée pour signer le JWT est une valeur faible, comme une courte chaîne facile à deviner telle que security2024. Les attaquants peuvent utiliser des attaques par dictionnaire, des tables arc-en-ciel, ou d’autres techniques de force brute pour trouver la clé secrète.

Voici un JWT valide signé avec l’algorithme HS256 et une clé secrète robuste :

Terminal window
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTYyNDI2MjIsImlhdCI6MTUxNjIzOTAyMiwibmFtZSI6IkpvaG4gRG9lIiwic3ViIjoiMmNiMzA3YmEtYmI0Ni00MTk0LTg1NGYtNDc3NDA0NmQ5YzliIn0.ZuwZrXpLRj17vDjOLoOOJ7pr1CN5DnE8Clgn4y-fjNs

Ce JWT décodé contient ces parties :

{
"alg": "HS256",
"typ": "JWT"
}
{
"iat": 1516239022,
"exp": 1516242622,
"name": "John Doe",
"sub": "2cb307ba-bb46-4194-854f-4774046d9c9b"
}

Le JWT suivant est signé avec le secret secret :

Terminal window
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTYyNDI2MjIsImlhdCI6MTUxNjIzOTAyMiwibmFtZSI6IkpvaG4gRG9lIiwic3ViIjoiMmNiMzA3YmEtYmI0Ni00MTk0LTg1NGYtNDc3NDA0NmQ5YzliIn0.gTgBr6lotpAxs4M46PgUXrjhIN5-gYG4HffKSEIB6Ys

Si vous voulez tester si votre serveur est vulnérable à la vulnérabilité « JWT Weak Secret », vous pouvez utiliser la commande crack :

Terminal window
jwtop crack [token] --url [url]

Pour tenter de retrouver par force brute la clé secrète d’un token, utilisez la commande exploit weaksecret :

Terminal window
jwtop exploit weaksecret [token]

Vous pouvez aussi fournir une wordlist personnalisée :

Terminal window
jwtop exploit weaksecret [token] --wordlist my-wordlist.txt

Pour les grandes wordlists, jwtop peut optionnellement se rabattre sur les outils externes john ou hashcat si son attaque par dictionnaire intégrée ne trouve pas le secret (voir crack » Outils de cracking externes) :

Terminal window
jwtop exploit weaksecret [token] --wordlist rockyou.txt --hashcat

L’impact d’utiliser une clé secrète faible pour signer un JWT est significatif. Les attaquants peuvent facilement retrouver la clé secrète et modifier les claims et le contenu du token sans être détectés. Cela peut mener à un accès non autorisé, une falsification des données, et d’autres risques de sécurité.

Assurez-vous de changer la clé secrète pour une valeur robuste et unique. Utilisez un générateur aléatoire sécurisé pour créer la clé secrète et stockez-la de façon sécurisée. Faites tourner la clé secrète périodiquement pour limiter le risque d’accès non autorisé et de falsification des données.