JWT Saldırıları
JWT Nedir?
JWT, JSON formatında verileri iletmek için standart bir formattır.
Genellikle kimlik doğrulama, oturum yönetimi ve erişim kontrolü mekanizmalarında kullanıcılarla ilgili bilgi göndermek için kullanılır.
JWT, kullanıcının bir web sitesinde oturum açtığında oluşturulan bir kimlik doğrulama aracıdır.
Bu, bir token gibi düşünülebilir: Sunucu, kullanıcıyı tanımlamak için bu veriyi saklamaz; ama token aracılığıyla kim olduğunu anlayabilir.
JWT Yapısı
JWT formatı üç bölümden oluşur: header, payload ve signature. Bu bölümler bir nokta (.) ile ayrılır.
Header: Token’ın türü (örneğin, JWT) ve şifreleme algoritması gibi temel bilgileri içerir.
Payload: Kullanıcı hakkında bilgileri içerir; örneğin, kullanıcının adı, rolü ve token’ın kim tarafından verildiğini belirtir. Aşağıda bir örnek payload verilmiştir:
Bu claim, token’ın kim tarafından verildiğini, ne zaman sona ereceğini, kime ait olduğunu ve rolünü belirtiyor.
Signature: Header ve payload, belirli bir anahtar kullanılarak hashlenir ve imzalanır. Bu işlem, token’ın oluşturulduktan sonra değişikliğe uğramadığını doğrular.
Anahtarı bilmeden bir header veya payload için doğru imzayı oluşturmak mümkün değildir.
Aşağıda tam bir JWT token örneği bulunmaktadır:
Güvenlik
JWT'nin güvenliği, token’ın gerçekten sunucu tarafından verildiğini ve değişikliğe uğramadığını doğrulamak için kritik öneme sahiptir. İmzalanmamış bir token, kötü niyetli kişiler tarafından kolayca değiştirilebilir veya taklit edilebilir. Bu durum, oturum açma bilgileri gibi hassas verilere yetkisiz erişim sağlanmasına yol açabilir.
Signature Kırma
Signature anahtarını kırmak için hashcat kullanacağız. Kırmak için kullanacağımız kelime listesi burada bulunmaktadır. Kıracağımız JWT hash’i aşağıda mevcuttur:
Hashcat ile brute-force işlemini başlatmak için aşağıdaki komutu kullanacağız:
Bu komutu çalıştırarak, JWT’nin secret anahtarının secret1 olduğunu öğrendik.
Son olarak bir lab çözüp bitirelim.
Web uygulamasına giriş yaptığımızda şu tarz bir jwt token ile karşılaşıyoruz bunu decode ettiğimizde değer şöyle:
Header:
Payload:
burada kullanıcı adının bulunduğunu görüyoruz eğer kullanıcı adını administrator ile değiştirirsek yetki yükseltmiş oluyoruz
bu basit bir örnek sadece konunun daha iyi anlaşılması açısından verdim.
kullandığım kaynaklar:
jwt token decode etmek için bu siteyi: Online JWT Decoder
wordlist için ise burayı kullandım: https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
Ayrıca imla hatalarını düzeltmesi için chatgpt kullandım.
JWT Nedir?
JWT, JSON formatında verileri iletmek için standart bir formattır.
Genellikle kimlik doğrulama, oturum yönetimi ve erişim kontrolü mekanizmalarında kullanıcılarla ilgili bilgi göndermek için kullanılır.
JWT, kullanıcının bir web sitesinde oturum açtığında oluşturulan bir kimlik doğrulama aracıdır.
Bu, bir token gibi düşünülebilir: Sunucu, kullanıcıyı tanımlamak için bu veriyi saklamaz; ama token aracılığıyla kim olduğunu anlayabilir.
JWT Yapısı
JWT formatı üç bölümden oluşur: header, payload ve signature. Bu bölümler bir nokta (.) ile ayrılır.
Header: Token’ın türü (örneğin, JWT) ve şifreleme algoritması gibi temel bilgileri içerir.
Payload: Kullanıcı hakkında bilgileri içerir; örneğin, kullanıcının adı, rolü ve token’ın kim tarafından verildiğini belirtir. Aşağıda bir örnek payload verilmiştir:
JSON:
{
"iss": "testApp",
"exp": 1732614974,
"sub": "user123",
"role": "usr"
}
Bu claim, token’ın kim tarafından verildiğini, ne zaman sona ereceğini, kime ait olduğunu ve rolünü belirtiyor.
Signature: Header ve payload, belirli bir anahtar kullanılarak hashlenir ve imzalanır. Bu işlem, token’ın oluşturulduktan sonra değişikliğe uğramadığını doğrular.
Anahtarı bilmeden bir header veya payload için doğru imzayı oluşturmak mümkün değildir.
Aşağıda tam bir JWT token örneği bulunmaktadır:
Kod:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0ZXN0QXBwIiwiaWF0IjoxNjY1MDU3NjY3LCJleHBpcmF0aW9uIjoxNjY1MDU3Njg3LCJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6InVzciJ9.S3krD1gJ3Vn3QW_X-2O9pXGdaZnVVZbMmI1Kfn3bcRY
Güvenlik
JWT'nin güvenliği, token’ın gerçekten sunucu tarafından verildiğini ve değişikliğe uğramadığını doğrulamak için kritik öneme sahiptir. İmzalanmamış bir token, kötü niyetli kişiler tarafından kolayca değiştirilebilir veya taklit edilebilir. Bu durum, oturum açma bilgileri gibi hassas verilere yetkisiz erişim sağlanmasına yol açabilir.
Signature Kırma
Signature anahtarını kırmak için hashcat kullanacağız. Kırmak için kullanacağımız kelime listesi burada bulunmaktadır. Kıracağımız JWT hash’i aşağıda mevcuttur:
Kod:
eyJraWQiOiI0OWNhNjkwYS00YTg3LTQ1NTktOTQ1Yy1hMmVmYWYwMzM4OWMiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTczMDM5NDM2MSwic3ViIjoid2llbmVyIn0.xwM5f85KVjOnJE1ezJkT2V2-91mj9Whr_7vggp6XkK4
Hashcat ile brute-force işlemini başlatmak için aşağıdaki komutu kullanacağız:
Bash:
hashcat -a 0 -m 16500 jwt.txt wordlist.txt
Bu komutu çalıştırarak, JWT’nin secret anahtarının secret1 olduğunu öğrendik.
Son olarak bir lab çözüp bitirelim.
Kod:
GET /my-account?id=wiener HTTP/2
Host: 0a6600fc040516f081eaca8e00c60035.web-security-academy.net
Cookie: session=eyJraWQiOiIzOWVkYzg1OC00NDc1LTQ0NTUtODNhZC0yY2U3MDE3ZTQzNTQiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTczMDM5NjE3MCwic3ViIjoid2llbmVyIn0.jQpkyjqWHSHOLWfydPaTpWc8byl0lHSqdSoI8wH-57zLVmHDnmq7RUwTnZC5j_WLq2jhP16BVVMInaFj5DkhL1oz3NqRALV4zjkPlo8l4jkQyaIZf8Bu4juaPDSneoEKqqUY0YECJKYOPx3MaatgqKZwYzdfxnCOV-IGwRiCrbqH2PuKvFtE2Y8Zw0_ItckpGqzxfr_IC399uyZ-RQcv-H_A-8Eb8wHWtMIH66x4mRlyzYF49gKhBgnVNHdtHeLyMN2PGPy-hAKoCNK4W98L83UDTlTHJGYFYf6UG2nUbWbUB8QMkm-tks8DFJX767ohkPY7vrE2vYUkbuoh7m8xgQ
Cache-Control: max-age=0
Sec-Ch-Ua: "Not(A:Brand";v="24", "Chromium";v="122"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0a6600fc040516f081eaca8e00c60035.web-security-academy.net/login
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Priority: u=0, i
Web uygulamasına giriş yaptığımızda şu tarz bir jwt token ile karşılaşıyoruz bunu decode ettiğimizde değer şöyle:
Header:
Kod:
{
"kid": "39edc858-4475-4455-83ad-2ce7017e4354",
"alg": "RS256"
}
Payload:
Kod:
{
"iss": "portswigger",
"exp": 1730396170,
"sub": "wiener"
}
burada kullanıcı adının bulunduğunu görüyoruz eğer kullanıcı adını administrator ile değiştirirsek yetki yükseltmiş oluyoruz
bu basit bir örnek sadece konunun daha iyi anlaşılması açısından verdim.
kullandığım kaynaklar:
jwt token decode etmek için bu siteyi: Online JWT Decoder
wordlist için ise burayı kullandım: https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
Ayrıca imla hatalarını düzeltmesi için chatgpt kullandım.


