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.

None

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.

None

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

None

Sistemin kimlik doğrulamasının JWT üzerinden çalıştığını görüyoruz.

jwt.io üzerinden JWT'mizi decode edip inceleyelim.

None

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.

None

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.

None

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.pem

Açı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.

None
jwt_tool <JWT> -X k -pk key.pem -I -pc sub -pv administrator

Komutun 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 administratorsub claim'ine atayacağımız değeri belirtiyoruz

Bu komut, sub değeri administrator olan ve public key ile HS256 imzalanmış yeni bir JWT üretir.

None

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

None

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

None

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

None

Laboratuvarı başarıyla tamamladık.

None

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: