Web uygulamalarının sizi tanımasının en basit yolu, tarayıcınıza yerleştirilen çerezlerdir. Sunucu bir çerezi ayarladıktan sonra, her istekle birlikte size güvenerek geri gönderir. Ancak bu güven, saldırganlar tarafından kolayca istismar edilebilir. Geliştiriciler hassas bilgileri — örneğin oturum durumunu ya da rol bilgilerini — doğrudan çerezlerde sakladığında, saldırganlar sadece bu değerleri değiştirerek yetkilerini artırabiliyor. Peki bu saldırılar nasıl gerçekleşiyor ve nasıl korunabilirsiniz?
Çerez Manipülasyonunun Temel Yöntemleri
Çerezleri değiştirerek uygulama haklarını ele geçirmenin üç yaygın yolu bulunuyor. Her biri, geliştiricilerin yaptığı yaygın hatalara dayanıyor ve doğru çözümler farklılaşıyor.
1. Düz Metin Olarak Saklanan Çerezler: En Basit Saldırı Vektörü
Bazı uygulamalar, kullanici_giris=true ya da yetkili=false gibi değerleri doğrudan çerezlerde düz metin olarak saklıyor. Sunucu bu çerezleri tarayıcıya gönderirken, herhangi bir doğrulama yapmıyor. Saldırganlar ise sadece bu değerleri değiştirerek uygulamaya erişim sağlayabiliyor.
Örneğin, sunucu aşağıdaki çerezleri ayarladıktan sonra:
Set-Cookie: kullanici_giris=true; Max-Age=3600; Path=/
Set-Cookie: yetkili=false; Max-Age=3600; Path=/Temel bir istek gönderildiğinde yanıt:
Kullanıcı Girişi YokSunucunun ayarladığı çerezlerle istek gönderildiğinde:
Kullanıcı Olarak Giriş YapıldıAncak yetkili değerini true olarak değiştirmek yeterli:
Kullanıcı Olarak Giriş YapıldıBu basit değişiklikle saldırgan, admin yetkilerini ele geçirebiliyor. Sunucu, çerezin başlangıçta hangi değerlerle ayarlandığını kontrol etmiyor — sadece gelen veriye güveniyor.
Korunma Yöntemi: Yetkilendirme verilerini asla istemci tarafında saklamayın. Bunun yerine, rastgele bir oturum kimliği oluşturun ve bu kimliği sunucu tarafında bir depolama sistemiyle eşleştirin. Çerezin içeriğine asla güvenmeyin.
2. Karmalı Çerezler: Tahmin Edilebilir Güvenlik
Bazı geliştiriciler, çerezleri düz metin yerine karma (hash) fonksiyonlarıyla korumayı deniyor. Ancak karma fonksiyonları deterministik olduğu için aynı girdi her zaman aynı çıktıyı üretiyor. Bu da saldırganların, sunucunun hangi değerleri kontrol ettiğini bildiğinde, bu değerlerin karma karşılığını hesaplayarak yetki kazanmasını mümkün kılıyor.
Örneğin, 1 sayısının farklı karma yöntemleriyle ürettiği çıktılar:
- MD5:
c4ca4238a0b923820dcc509a6f75849b - SHA-256:
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b - SHA-512:
4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed66510a - SHA-1:
356a192b7913b04c54574d18c28d46e6395428ab
Saldırgan, admin kelimesinin MD5 karşılığını hesaplayarak rol çerezini değiştirebilir:
echo -n "admin" | md5sumÇıktı:
21232f297a57a5a743894a0e4a801fc3Bu değeri rol çerezine yerleştirerek admin sayfasına erişim sağlanabilir. Aynı şekilde, salter (salt) kullanılmayan karma değerler, gökkuşağı tablolarıyla da çözülebiliyor.
Korunma Yöntemi: Çerezleri imzalamak için sunucu tarafında gizli bir anahtar kullanın. Ayrıca, her oturum için benzersiz bir tuz (salt) ekleyerek, aynı girdinin farklı oturumlarda farklı çıktılar üretmesini sağlayın. Sadece karma kullanmak, güvenlik sağlamaz — çünkü girdiler tahmin edilebilir.
3. Base64 ile Şifrelenmiş Görünen Çerezler: Basit Bir Kod Çözme İşlemi
Base64, şifreleme değil kodlama yöntemidir. Herhangi biri tarafından kolayca çözülebilir. Buna rağmen bazı uygulamalar, oturum verilerini Base64 ile kodlanmış çerezlerde saklıyor ve bu verileri güvenilir kabul ediyor.
Örneğin, sunucu aşağıdaki çerezi ayarladıktan sonra:
Set-Cookie: oturum=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/Bu değeri çözdüğünüzde:
echo 'eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==' | base64 -dÇıktı:
{"id": 1, "yetkili": false}Değeri değiştirip tekrar kodladığınızda:
echo -n '{"id": 1, "yetkili": true}' | base64Çıktı:
eyJpZCI6MSwiYWRtaW4iOnRydWV9Bu değiştirilmiş çerezi göndererek admin erişimi elde edilebilir. Sunucu, çerezin gerçekten sunucu tarafından oluşturulduğunu doğrulamadığı için saldırı başarılı oluyor.
Korunma Yöntemi: Daima imzalı tokenler kullanın — örneğin JWT. Sunucu tarafında imzayı doğruladıktan sonra çerez verilerine güvenin. Eğer çerezde hassas veriler bulunması gerekiyorsa, şifreli tokenler kullanarak içeriğin okunamaz veya değiştirilemez olmasını sağlayın.
Güvenlik Açığından Korunmanın En İyi Uygulamaları
Çerez manipülasyonu, sunucunun güvenmemesi gereken veriye güvenmesinden kaynaklanıyor. Bu sorunu çözmek için izlenmesi gereken adımlar şunlar:
- Sunucu tarafında yetkilendirme: Tüm yetkilendirme verilerini istemci yerine sunucu tarafında saklayın. Sadece rastgele oturum kimlikleri kullanın.
- İmzalama ve doğrulama: Çerezleri bir gizli anahtarla imzalayın ve her istek için imzayı doğrulayın. Bu şekilde, çerezlerin değiştirilmesi engellenmiş olur.
- Şifreleme kullanın: Eğer çerezlerde hassas veriler bulunuyorsa, bunları şifreleyin ve sadece sunucu tarafından çözülebilir hale getirin.
- Geliştirme aşamasında test edin: Uygulamanızı güvenlik testlerine tabi tutun ve çerez manipülasyonu senaryolarını simüle edin.
Çerez manipülasyonu, yazılım güvenliğinin temellerinden biri. Bu saldırı vektörüne karşı korunmak, geliştiricilerin ve güvenlik uzmanlarının ortak sorumluluğu. Uygulamanızda bu açıkları henüz kapatmadıysanız, şimdi harekete geçmenin tam zamanı.
Güvenlik konusunda daha fazla bilgi edinmek ister misiniz? Uygulama güvenliği (AppSec) hakkında tartışmalara katılın ya da yorumlarınızı paylaşın. Her zaman yeni teknikler ve en iyi uygulamalar hakkında konuşmaya açığız!
Yapay zeka özeti
Çerez manipülasyonu saldırılarıyla uygulamalarınıza nasıl admin hakları kazanılır? Düz metin, karma ve Base64 saldırılarının arkasındaki teknikleri ve korunma yollarını keşfedin.