Dostlar selam,
Scarlet ablamızın fotosunu gören sevinmiştir diye tahmin ediyorum bende mutluyum,
üzülenler ve içten içe kendini yiyenlerde olacaktır onlara da en altta bir şarkı sallıcam.
Evet neydi konumuz JWT Security filan işte
Neyse ver sunucu ver başlığı;
1- JWT ?
JWT denince bazı developer kolpaları;
“Kanka biz artık secure’uz ya, JWT’ye geçtik
”
“JWT var abi, session yok bizde”
Yani açılımı JSON WEB TOKEN mealine gelir, applicationlarda authorization ve authentication kullanılan mekanizmadır.
Genelde biz artık modern app yazıyoruz biz, RESTAPI, microservis filan bizde çok derken herkes JWT kullanıyor eee tabi birde AI ile vibe coderlarda yazıyor derken bu işin securitysi nerde ?
Şimdik JWT dediğimiz şey aslında 3 parçalı bir yapı:
Header.Payload.Signature
HEADER:
Signature tarafından bir secret key olur bu burada yazana algoritma ile şifrelenir. Genel şöyle bir yapı görürüz.
Scarlet ablamızın fotosunu gören sevinmiştir diye tahmin ediyorum bende mutluyum,
üzülenler ve içten içe kendini yiyenlerde olacaktır onlara da en altta bir şarkı sallıcam.
Evet neydi konumuz JWT Security filan işte
Neyse ver sunucu ver başlığı;
1- JWT ?
JWT denince bazı developer kolpaları;
“Kanka biz artık secure’uz ya, JWT’ye geçtik
“JWT var abi, session yok bizde”
Yani açılımı JSON WEB TOKEN mealine gelir, applicationlarda authorization ve authentication kullanılan mekanizmadır.
Genelde biz artık modern app yazıyoruz biz, RESTAPI, microservis filan bizde çok derken herkes JWT kullanıyor eee tabi birde AI ile vibe coderlarda yazıyor derken bu işin securitysi nerde ?
Şimdik JWT dediğimiz şey aslında 3 parçalı bir yapı:
Header.Payload.Signature
HEADER:
Signature tarafından bir secret key olur bu burada yazana algoritma ile şifrelenir. Genel şöyle bir yapı görürüz.
JSON:
{
"alg": "HS256",
"typ": "JWT",
"kid":"KEY_ID_VALUE"
}
ALG: Şifreleme algoritması, type: jwt token belirteci, kid: sunucu tarafından kontrol edilen key_id değeri. Bazı şeyleri artık bildiğinizi varsayarak atlayarak ileriyorum bilmeyenler web server güvenliğindeki sabit konulara bakabilir (çoğu benim zaten +9999 boss)
PAYLOAD:
Genelde burada user datası olur örneğin,
PAYLOAD:
Genelde burada user datası olur örneğin,
JSON:
{
"username": "GeceGolgemiOlur",
"role": "OldAnkaManager",
"exp": 1710000000
}
SIGNATURE:
işte burası namusu burası, tht nin son kalesi filan diyim ayak üstü suratınızdaki bir tebessümü görüyorum.
işte burası namusu burası, tht nin son kalesi filan diyim ayak üstü suratınızdaki bir tebessümü görüyorum.
JavaScript:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
Eğer burası düzgün kontrol edilmiyors, shift+enter: ggwp çerEZ
Genel yapıyı anladık peki nedir bunun saldırı senaryoları ?
SALDIRGAN 1 (Fosil Teknik)
Algoritma tarafında alg: yı none (NoNe,nOnE gibi bypassları da var) olarak değiştirebilirsek backend kontrol etmeyip aa buda token username de var diyorsa o tokenı istediğin gibi manipüle edebiliyorsun kardeş
Genel yapıyı anladık peki nedir bunun saldırı senaryoları ?
SALDIRGAN 1 (Fosil Teknik)
Algoritma tarafında alg: yı none (NoNe,nOnE gibi bypassları da var) olarak değiştirebilirsek backend kontrol etmeyip aa buda token username de var diyorsa o tokenı istediğin gibi manipüle edebiliyorsun kardeş
JSON:
{
"alg": "none"
}
SALDIRGAN 2 (trajikomiklik seviyesi)
Siganture verify yok, bazı fullstackler şöyle işler yapıyor,
he şunu yapsa olacak
Yani: kimlik kontrolü yok, sadece kartı göster yeter
Payload’ı değiştir:
Siganture verify yok, bazı fullstackler şöyle işler yapıyor,
JavaScript:
jwt.decode(token)
JavaScript:
jwt.verify(token, secret)
Yani: kimlik kontrolü yok, sadece kartı göster yeter
Payload’ı değiştir:
JavaScript:
{
"role": "Administrator"
}
SALDIRGAN 3 (Brutecu)
Şimdi bu secret keyin adı üstünde gizli bir key olması lazım, test ortamında diye yapıyor secret keyi "1234567890123456789087654321" şimdi denk gelmez demeyin geliyor işte, özellikle HS256 gibi algoritmalar hashcat ile bruteforce saldırılarına tabi tutulabiliyor, secret keyi kıran jwt tokenda istediği manipülasyonu yapar nokta.
SALDIRGAN 4 (Developerın kafasını okuyabilen, helal)
Yukarıda da belirttiğimiz gibi keyid değerleri tokenın hangi key ile imzalandığını kontrol etmek için kullanılır.
Şimdi bu secret keyin adı üstünde gizli bir key olması lazım, test ortamında diye yapıyor secret keyi "1234567890123456789087654321" şimdi denk gelmez demeyin geliyor işte, özellikle HS256 gibi algoritmalar hashcat ile bruteforce saldırılarına tabi tutulabiliyor, secret keyi kıran jwt tokenda istediği manipülasyonu yapar nokta.
SALDIRGAN 4 (Developerın kafasını okuyabilen, helal)
Yukarıda da belirttiğimiz gibi keyid değerleri tokenın hangi key ile imzalandığını kontrol etmek için kullanılır.
JSON:
{
"alg": "HS256",
"kid": "key1"
}
Bu şekilde header da gördük bunu, örneğin backend de bunu bu şekilde kontrol ediyorsa,
Bu adamı öperler
PHP:
$key = file_get_contents("/keys/" . $kid);
JSON:
{
"kid": "../../../../etc/passwd"
}
---------------------------------------------------------------------------------------------------------------------------
İşte buraya kadar kısmı ile sözel bir şeyler gördük tabi ki P4$A farkıyla bir iki BURP'de istek kovalıyalım.
Giriş yapalım
Post isteğinin responsunda eyJ diye başlayan değer döndü o bizim JWT tokenımız
Şunu da BAppStore dan indirelim
İsteğe tekrar gelince response da JSON Web Token yazıyor tıklayınca auto decode ediyor.
Biraz gezelimi, istek toplayalım historyden bakarız,
Profile ve Admin kısmına bakıcaz anlaşılan
Fosil tekniği ile başlayalım, tekrar isteği gönderince reponse da yine data geliyor bu demek ki alg kontrolü atlatılabiliyor.
Baktık alg kontrolü yok, role değiştirince role değişiyor mu diye baktım ve gerçekten response da admini gördük nice ama bu olay sadece alg dan mı yoksa signature kontrolü var mı yokmu bi bakayım ona da.
Nice Shot Signature kontrolüde yok, hemen admin paneline erişebilecek miyiz deneyelim
Hoş geldiniz yazısı mutlu etti <3
hashcatin -m değeri 16500 kırmayı deneyelim,
Secret keyi kırdık, "iloveblondee" muş
Peki bunu nasıl doğrulucaz ?
jwt .io sitesine git jwt tokenı yapıştır, sol altta secret yazan yere secret keyini gir dene
Valid Secret yazıyor demekki secret keyimiz doğru
Secret keyin kırılması demek istediğimiz yetki rol fark etmeksizin her userın adına işlem yapabiliriz demek eller kaşınıyor.
---
EEE Tabi yolcu yolunda gerek, uzun zamandır ai contentler görüyordum ilaç gibi gelir.
Beğendiysen aşağıya kredi bıraktım, keyfi isteyen basar
Yukarıda dediğim şarkı, anlayan anladı
İşte buraya kadar kısmı ile sözel bir şeyler gördük tabi ki P4$A farkıyla bir iki BURP'de istek kovalıyalım.
Giriş yapalım
Post isteğinin responsunda eyJ diye başlayan değer döndü o bizim JWT tokenımız
Şunu da BAppStore dan indirelim
İsteğe tekrar gelince response da JSON Web Token yazıyor tıklayınca auto decode ediyor.
Biraz gezelimi, istek toplayalım historyden bakarız,
Profile ve Admin kısmına bakıcaz anlaşılan
Fosil tekniği ile başlayalım, tekrar isteği gönderince reponse da yine data geliyor bu demek ki alg kontrolü atlatılabiliyor.
Baktık alg kontrolü yok, role değiştirince role değişiyor mu diye baktım ve gerçekten response da admini gördük nice ama bu olay sadece alg dan mı yoksa signature kontrolü var mı yokmu bi bakayım ona da.
Nice Shot Signature kontrolüde yok, hemen admin paneline erişebilecek miyiz deneyelim
Hoş geldiniz yazısı mutlu etti <3
hashcatin -m değeri 16500 kırmayı deneyelim,
Secret keyi kırdık, "iloveblondee" muş
Peki bunu nasıl doğrulucaz ?
jwt .io sitesine git jwt tokenı yapıştır, sol altta secret yazan yere secret keyini gir dene
Valid Secret yazıyor demekki secret keyimiz doğru
Secret keyin kırılması demek istediğimiz yetki rol fark etmeksizin her userın adına işlem yapabiliriz demek eller kaşınıyor.
---
EEE Tabi yolcu yolunda gerek, uzun zamandır ai contentler görüyordum ilaç gibi gelir.
Beğendiysen aşağıya kredi bıraktım, keyfi isteyen basar
Yukarıda dediğim şarkı, anlayan anladı
Son düzenleme:





