Algorithm confusion attacks nedir?
Algorithm confusion saldırıları (key confusion attacks olarak da bilinir), saldırganın sunucuyu bir JWT'nin imzasını geliştiricilerin amaçladığından farklı bir algoritma ile doğrulamaya zorladığı durumlarda ortaya çıkar. Sonuç: saldırgan, gizli anahtarı bilmeden geçerli token'lar üretebilir.
Saldırının temelinde iki algoritma arasındaki fark yatar:
- RS256 (asimetrik): Token private key ile imzalanır, public key ile doğrulanır. Public key herkese açıktır.
- HS256 (simetrik): Aynı secret hem imzalar hem doğrular ve gizli kalmalıdır.
Zafiyet, sunucunun doğrulama sırasında header'daki alg alanına körü körüne güvenmesinden doğar. Saldırgan alg değerini HS256 olarak değiştirdiğinde, sunucu RSA public key'i HMAC secret'ı olarak kullanmaya başlar. Public key zaten herkese açık olduğu için saldırgan bu anahtarla kendi token'ını imzalayıp sunucuya geçerli kabul ettirebilir.
PortSwigger Web Security Academy üzerinden laboratuvarımızı incelemeye başlayalım.

JWT tabanlı oturum mekanizması RSA anahtar çifti kullanır ancak implementasyon hatası nedeniyle algorithm confusion açığı vardır. Sunucunun public key'i elde edilip bu anahtar ile sahte bir JWT imzalanarak yetki yükseltilir (/admin erişimi) ve ardından carlos kullanıcısı silinir.
Verilen credentials: wiener:peter
İpucu: Sunucunun public key'ini bir X.509 PEM dosyası olarak sakladığını varsayabilirsiniz.
Laboratuvara erişelim ve testlerimize başlayalım.
Lab ortamımızı açtıktan sonra "My Account" sayfasına gidip verilen credentials ile giriş yapalım.

Giriş yaptıktan sonra Burp Suite veya DevTools'un Storage sekmesi üzerinden set edilen cookie değerimize bakalım.

Sistemin kimlik doğrulamasının JWT üzerinden çalıştığını görüyoruz.
jwt.io üzerinden JWT'mizi decode edip inceleyelim.

Header'daki alg alanından token'ın RS256 ile imzalandığını, payload'daki sub alanından ise oturum açan hesabın kullanıcı adının tutulduğunu görüyoruz.
Şimdi algorithm confusion saldırısına geçelim.
İlk hedefimiz sunucunun public key'ini ele geçirmek. Sunucular bazen public key'lerini /jwks.json veya /.well-known/jwks.json gibi standart endpoint'ler üzerinden JSON Web Key (JWK) formatında herkese açık olarak sunarlar.
/jwks.json endpoint'ine gidip sunucunun JWK'sını alalım.

Bu public key'i oluşturacağımız HS256 imzalı token'da kullanacağız. Bunun için önce JWK'yı PEM formatına dönüştürmemiz gerekiyor.
CyberChef üzerinden "JWK to PEM" işlemi ile PEM değerimizi alalım.

Bundan sonraki adımlar için jwt_tool kullanacağım ve işlemlerime Kali Linux üzerinde devam edeceğim.
Elde ettiğimiz PEM değerini bir dosyaya kaydedelim:
nano key.pemAçılan nano editörüne PEM değerimizi yapıştırıp kaydediyoruz.
Ardından jwt_tool'a geçeceğiz. Bunun için başa dönüp wiener hesabımıza set edilen JWT'yi alıyoruz ve aşağıdaki komutu hazırlıyoruz.

jwt_tool <JWT> -X k -pk key.pem -I -pc sub -pv administratorKomutun parametrelerini açıklayalım:
<JWT>— wiener hesabımızdan aldığımız orijinal token-X k— exploit türü olarak key confusion saldırısını seçiyoruz-pk key.pem— imzalama için kullanacağımız public key dosyasını belirtiyoruz-I— payload'a claim enjekte edeceğimizi belirtiyoruz-pc sub— değiştireceğimiz claim'i belirtiyoruz-pv administrator—subclaim'ine atayacağımız değeri belirtiyoruz
Bu komut, sub değeri administrator olan ve public key ile HS256 imzalanmış yeni bir JWT üretir.

Yeni JWT oluştu. Şimdi bu token'ı laboratuvardaki oturumumuzun cookie değeri olarak girip Enter'a basalım ve F5 ile sayfayı yenileyelim.

Sayfada yeni beliren "Admin Panel" bağlantısına tıklayıp admin panele erişelim.

Admin panele eriştikten sonra carlos kullanıcısını silelim.

Laboratuvarı başarıyla tamamladık.

Tüm bu adımları jwt_tool yerine Burp Suite'in JWT Editor eklentisi üzerinden de birebir gerçekleştirebilirsiniz: https://portswigger.net/burp/documentation/desktop/testing-workflow/vulnerabilities/session-management/jwts
Bu laboratuvarda, günümüzde modern kütüphanelerle birlikte artık daha az karşılaşılan ancak legacy sistemlerde, custom implementasyonlarda ve karmaşık mikroservis mimarilerinde hâlâ var olan JWT güvenliğinin temel açıklarından biri olan algorithm confusion saldırısını birlikte inceledik ve Expert seviyeli laboratuvarı başarıyla tamamlamış olduk.
Kaynaklar: