En-tête négligent

Décodage de la signature Web JSON : Pièges de la vérification, confusion des clés et exploits réels

Signature Web JSON (JWS) Le décodage est le processus d'analyse et de vérification des composants d'un jeton JWS - en-tête, charge utile et signature - afin d'extraire les données signées et de vérifier leur intégrité. Dans le contexte des tests de sécurité et de pénétration, le décodage d'un JWS aide les analystes à comprendre quelles sont les revendications intégrées, à détecter les mauvaises configurations et à identifier les pratiques de signature faibles qui peuvent conduire à des vulnérabilités telles que le contournement de la signature ou la falsification du jeton.

Cet article explique Pourquoi le décodage JWS est-il important ?Il s'agit d'un outil qui permet de décoder et de vérifier les signatures à l'aide d'un code réel, d'éviter les pièges les plus courants, de déterminer les implications en matière de sécurité et de définir les stratégies de défense que vous devriez connaître en 2025.

Qu'est-ce que la signature Web JSON (JWS) ?

Signature Web JSON (JWS) est un moyen compact et sûr de représenter un message signé. Il est défini dans RFC 7515 et couramment utilisé pour garantir l'authenticité et l'intégrité des données transférées via les API REST, l'authentification unique (SSO) et les flux d'authentification des microservices.

Un jeton JWS typique se présente comme suit :

nginx

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIwibmFtZSI6IkpvZSJ9 . MEUCIQDh...

Chaque segment est Base64URL codé :

  1. En-tête - décrit l'algorithme et le type de jeton
  2. Charge utile (réclamations) - les données signées
  3. Signature - preuve d'intégrité

Le décodage d'un JWS sans vérification de la signature révèle les revendications, mais seule la vérification prouve qu'elles proviennent d'une source fiable.

Norme faisant autorité : RFC 7515 - https://tools.ietf.org/html/rfc7515

Décodage de la signature Web JSON : Pièges de la vérification, confusion des clés et exploits réels Penligent

Pourquoi décoder un JWS ? Perspectives en matière de sécurité et de test

Le décodage d'un JWS a plusieurs objectifs :

  • Comprendre les revendications intégrées : Qui est l'utilisateur ? Quelles sont les autorisations ?
  • Identifier l'algorithme de signature : Les algorithmes faibles (par exemple, aucun ou HS256 avec des clés prévisibles)
  • Évaluer l'intégrité : Détecter les jetons falsifiés
  • Découvrir les vulnérabilités : Contournement de la signature, attaques par dégradation de l'algorithme

Du point de vue de la sécurité offensive, la découverte de pratiques de signature JWS déficientes peut conduire à des exploits permettant aux attaquants de falsifier des jetons et d'élever leurs privilèges.

Anatomie d'un jeton JWS

Voici la répartition d'un jeton typique :

SegmentSignificationExemple
En-têteAlgorithme et métadonnées{"alg" : "RS256", "typ" : "JWT" }
Charge utileRéclamations{"sub" : "12345", "role" : "admin" }
SignatureChiffre d'affaires signéBase64URL de l'en-tête et de la charge de paiement cryptés

Un JWS décodé présente un JSON simple pour l'en-tête et la charge utile :

ini

HeaderJSON = base64url_decode(part1)PayloadJSON = base64url_decode(part2)

Le décodage ne prouve pas l'authenticité - seule la vérification de la signature le fait.

Décodage simple de JWS (sans vérification)

Dans le cadre du triage de sécurité, la première étape consiste souvent à voir ce qu'il y a à l'intérieur :

Exemple Python (décodage uniquement)

python

import base64import json def base64url_decode(input_str) : rem = len(input_str) % 4 input_str += "=" * (4 - rem)return base64.urlsafe_b64decode(input_str) token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.SflKxw... "header, payload, signature = token.split('.') header_json = json.loads(base64url_decode(header)) payload_json = json.loads(base64url_decode(payload)) print("Header :", header_json)print("Payload :", payload_json)

Cette méthode produit un JSON lisible, mais ne permet pas de vérifier si la signature est correcte.

Vérification de la signature d'un JWS (sécurité critique)

Pour être sûr que le jeton est légitime, vous devez vérifier la signature à l'aide de l'algorithme et de la clé prévus. Voici comment procéder :

Exemple JavaScript (Node.js) en utilisant jose

javaScript

import { jwtVerify } from "jose" ; const token = "eyJ..." ; const publicKey = /* charger la clé publique appropriée, par exemple à partir du point de terminaison JWKS */ ; async function verifyToken() {try {const { payload } = await jwtVerify(token, publicKey);console.log("Verified payload :", payload) ; } catch (e) {console.error("Verification failed :", e) ; } } verifyToken() ;

Cela permet de s'assurer que le jeton a été signé par la bonne clé privée correspondant à la clé publique.

Exemple concret : Décodage d'un jeton OAuth

De nombreuses API émettent des jetons JWS pour le contrôle d'accès. Le décodage révèle des informations sur l'utilisateur et la session :

json

{"iss" : "", "sub" : "alice", "exp" : 1700000000, "scope" : "read write" }

Les équipes de sécurité examinent les jetons décodés pour vérifier les champs d'application et les délais d'expiration.

Vulnérabilités courantes dans les implémentations de JWS

Rétrogradation de l'algorithme

Certaines bibliothèques autorisent à tort la modification des alg à aucunce qui permet aux attaquants de contourner la vérification.

Exemple d'en-tête non sécurisé :

json

{"alg":"none","typ":"JWT"}

Attaque défense : Il faut toujours rejeter les jetons avec alg : aucun sauf s'il est explicitement sûr dans le contexte.

Clés symétriques faibles (HS256)

L'utilisation de clés symétriques faibles ou prévisibles permet aux attaquants de deviner la clé et de falsifier les jetons.

Atténuation :

  • Utiliser des clés secrètes fortes (≥ 256 bits)
  • Privilégier les algorithmes asymétriques (RS256, ES256)

Outils CLI pour un décodage rapide de JWS

OutilDescriptionOfficielle
jwt.io DébogueurDécodage et vérification en lignehttps://jwt.io
jose CLIDécodage/vérification basé sur les nœudshttps://github.com/panva/jose
jwt-cliCLI multiplateformehttps://github.com/mike-engel/jwt-cli

Exemple de décodage CLI :

bash

jwt decode eyJhbGciOi...

Scénario de vulnérabilité : Falsification d'un jeton (preuve de concept)

Si un serveur accepte de manière erronée alg : aucunqu'un attaquant peut falsifier :

css

En-tête : {"alg":"none","typ":"JWT"} Payload : {"sub":"attacker","role":"admin"} Signature : ""

Script de démonstration (Python) :

python

import base64import json def b64url(x) : return base64.urlsafe_b64encode(x).rstrip(b'=').decode() header = {"alg" : "none", "typ" : "JWT"} payload = {"sub" : "attacker", "role" : "admin"} token = f"{b64url(json.dumps(header).encode())}.{b64url(json.dumps(payload).encode())}. "print("Jeton falsifié :", jeton)

Défense :

  • Rejeter les jetons lorsque alg est aucun sauf s'ils sont explicitement sûrs
  • Appliquer la liste blanche des algorithmes
JSON Signature Web Décoder Penligent

L'importance de la vérification des signatures en 2025

Dans les microservices modernes et les API distribuées, les jetons déterminent les décisions d'accès. Une mauvaise vérification peut conduire à :

  • L'escalade des privilèges
  • Accès non autorisé
  • Détournement de session

Les testeurs de pénétration et les défenseurs doivent être en mesure de décoder et de valider les jetons de manière programmatique et à grande échelle.

Détection d'une vérification défaillante dans les API

Les scanners automatisés peuvent vérifier si une API tente d'accepter des signatures JWS non valides.

Pseudocode Python (contrôle de sécurité)

python

def test_broken_verification(api_url, forged_token) : headers = {"Authorization" : f "Bearer {forged_token}"} response = requests.get(api_url, headers=headers)return response.status_code bad_api = test_broken_verification("", forged_token)if bad_api == 200:print("Potentially vulnerable to JWS forgery")

Si l'API répond par 200 OKLa logique d'acceptation des jetons peut donc être défectueuse.

Meilleures pratiques défensives

DéfenseDescription
Utiliser des clés asymétriquesPréférer RS256, ES256 aux clés symétriques
Appliquer la liste blanche des algorithmesRejeter les valeurs alg inattendues
Durée de vie courte des jetonsMinimiser le risque de rediffusion
Rotation des touchesMettre à jour régulièrement les clés de signature
Bibliothèques de jetons d'auditMaintenir les dépendances à jour

Intégrer le décodage de tokens dans la sécurité CI/CD

En 2025, les pipelines de sécurité valident souvent automatiquement les pratiques JWS :

  • Automatisation de la mise à jour des configurations JWT
  • Test CI qui rejette les librairies non sécurisées
  • Surveillance de l'exécution en cas de mauvaise acceptation des jetons

Exemple d'extrait de script CI (Bash) :

bash

#Reject si un code utilise "alg : none "grep -R '"alg" : *"none"' ./src && exit 1

Concepts connexes : JWE vs JWS

DuréeSignification
JWSSignature Web JSON (signée uniquement)
JWEJSON Web Encryption (crypté)

JWE protège la confidentialité ; JWS protège l'intégrité et l'authenticité. De nombreux systèmes utilisent les deux en même temps.

Outils et bibliothèques (pile de sécurité 2025)

  • Node.js jose - Décodage et vérification JWT/JWS
  • Python python-jose - Prise en charge flexible de la cryptographie
  • OpenSSL - Vérification cryptographique de bas niveau
  • jwt.io - Décodeur web rapide
Partager l'article :
Articles connexes
fr_FRFrench