JWT nedir?

JWT nedir?

JWT (JSON Web Token), web uygulamalarında güvenli bilgi alışverişi sağlamak için kullanılan, JSON tabanlı ve RFC7519 standardına dayalı bir token formatıdır. Kimlik doğrulama, yetkilendirme ve veri paylaşımı gibi alanlarda güvenilir bir çözüm sunar. Özellikle web servisleri, mobil uygulamalar ve mikro servis mimarilerinde yaygın olarak kullanılır.

JWT neden tercih edilir?

1) Taşınabilirlik: JWT, tüm veriyi tek bir token içinde taşıdığı için farklı sistemler arasında kolayca iletilebilir.

2) Stateless (Durumsuz) Yapı: Sunucuda oturum bilgisi tutmadan, her istekle birlikte token ile kimlik doğrulama yapılabilir.

3) Yüksek Güvenlik: JWT, kriptografik imza ile güvence altına alındığından, token’ın bütünlüğü ve doğruluğu kolayca kontrol edilebilir.

4) Performans: Sunucular, kullanıcı bilgilerini her seferinde veritabanından sorgulamak yerine, JWT token’ları ile hızlıca kimlik doğrulama işlemi yapabilir.

5) Esneklik: JWT, genişletilebilir ve özelleştirilebilir, böylece farklı veri yapıları ve ek bilgiler taşıyabilir.

6) Cross-platform Desteği: JWT, platform bağımsız olarak farklı cihazlar ve teknolojiler arasında güvenli veri iletimi sağlar.

7) Kolay JSON Parsingi: Çoğu programlama dilinde JSON’a özel parser’lar bulunduğu için, JSON verisi kolayca işlenebilir ve geliştiriciler için daha verimli bir seçenek sunar. XML’in aksine, JSON verisi programlama dilindeki objelere kolayca dönüştürülebilir.

JWT Kimlik doğrulama mekanizması

1) Kullanıcı Girişi: Kullanıcı, kimlik doğrulama için kullanıcı adı ve şifresini sunucuya gönderir.

2) Token Oluşumu: Sunucu, kullanıcının kimlik bilgilerini doğruladıktan sonra, kullanıcı hakkında bilgileri (örneğin, kullanıcı adı, roller) içeren bir JWT oluşturur.

3) Token Gönderimi: Oluşturulan JWT, kullanıcıya HTTP yanıtı olarak gönderilir ve client tarafında saklanır.

4) Token Taşınması: Kullanıcı, sonraki her isteğinde JWT’yi HTTP header’ında (genellikle Authorization: Bearer ) sunucuya iletir.

5) Token Doğrulama: Sunucu, gelen isteklerdeki token’ı doğrular. Token, imza kontrolü ile geçerliliği sağlanır ve kimlik doğrulaması yapılır.

6) Yetkilendirme: Geçerli bir token ile sunucu, kullanıcının işlem yapmasına izin verir. Token geçerli değilse, kullanıcıdan yeniden giriş yapması istenir.

JWT yapısı nedir?

JWT, üç ana bileşenden oluşur: Header , Payload ve Signature.

Header: Header, token’ın tipini ve kullanılan imza algoritmasını belirtir. Örneğin, “JWT” tipinde ve genellikle “HS256” gibi bir HMAC SHA algoritması kullanılır.

Payload: Payload, JWT’nin asıl verilerini taşır. Bu veriler, genellikle kullanıcının kimlik bilgileri veya yetkilendirme bilgileri gibi verilerden oluşur. Payload’taki veriler base64 kodlanmış bir şekilde saklanır, ancak şifrelenmiş değildir.

Signature: İmza, header ve payload kısımlarının birleştirilip, gizli anahtar kullanılarak imzalanmasıyla oluşturulur. Bu imza, token’ın bütünlüğünü ve doğruluğunu korur. Token’ın içeriği değişirse, imza geçersiz olur.

JWT yapısının bu üç kısmı, birbirinden nokta (.) ile ayrılır ve tüm token, bir metin stringi olarak taşınır.

JWT’de En Yaygın Güvenlik Zafiyetleri Nelerdir?

JWT kullanımı, kimlik doğrulama ve yetkilendirme süreçlerini kolaylaştırsa da bazı güvenlik risklerini de beraberinde getirir. En yaygın zafiyetlerden biri, zayıf imzalama algoritmaları kullanılmasıdır; örneğin, none algoritması ile imzasız token’ların kabul edilmesi ciddi bir güvenlik açığı oluşturabilir. Ayrıca, hard-coded gizli anahtarlar kullanmak, saldırganların brute-force saldırılarıyla bu anahtarları ele geçirmesine olanak tanır. Token süresinin çok uzun tutulması veya süresiz token kullanımı, yetkisiz erişimlerin uzun süre devam etmesine sebep olabilir. Son olarak, hassas verilerin JWT içinde şifrelenmeden tutulması durumunda, saldırganlar token’ı ele geçirip base64 kod çözme işlemi ile bu bilgilere kolayca ulaşabilir. Bu nedenle, JWT kullanırken imza doğrulamasının titizlikle yapılması ve güvenli algoritmaların tercih edilmesi büyük önem taşır.

JWT Zafiyetlerinin tespiti ve Exploit edilmesi

Lab: JWT authentication bypass via unverified signature

İstek: Lab ortamımızda JWT ile oturum yönetimi yapıyoruz, ancak sunucu imza doğrulamadığı için token’ı değiştirip admin yetkisi kazanarak carlos kullanıcısını silmemiz isteniyor.(winer:peter)

Kullanıcı girişi sırasında request’leri incelediğimizde, cookie bilgisinin JWT formatında iletildiğini fark ettik. Payload kısmını detaylı taradığımızda ise inspector tool’unda decode edilmiş hali görüntüleniyor.

Admin endpoint’ine istekte bulunduğumuzda ilgili sayfanın sadece administrator kullanıcısı ile görüntülenebileceği uyarısı görünmektedir.

Payload’ı inspector panelinde düzenleyip weiner kullanıcı adını administrator olarak değiştirdikten sonra isteği yeniden gönderdiğimizde;

Admin paneline başarıyla erişip, admin/delete?username=carlos isteğini göndererek carlos kullanıcısını silip, laboratuvarı başarıyla tamamlıyoruz.

Makalemi okuduğunuz için teşekkür ederim. Başka bir yazıda tekrar görüşmek dileğiyle!

Written by

Oktay Çetin