Genel Bakış
Cross-Site Request Forgery (CSRF), bir saldırganın kurbanın tarayıcısını — kurbanın çerezlerini veya HTTP kimlik doğrulama kimlik bilgilerini taşıyan — kurban farkında olmadan veya rızası olmadan hedef uygulamaya HTTP isteği göndermeye yönlendirdiği istemci taraflı bir güvenlik açığıdır. Tarayıcı, depoladığı kimlik bilgilerini otomatik olarak eklediğinden hedef uygulama, sahte isteği yalnızca kimlik bilgileri bazında meşru bir istekten ayırt edemez.
CSRF, OWASP Top 10'da yıllarca bağımsız bir kategori olarak yer almış olup günümüzde CWE-352 kapsamında kodlanmıştır. Durum değiştiren işlemler için özellikle tehlikelidir: parola veya e-posta adresi değiştirme, para transferi başlatma, hesap ayrıcalıklarını değiştirme veya kayıt silme gibi eylemler bu kategoriye girer.
Nasıl çalışır?
Bu saldırı, web tarayıcılarının iki özelliğine dayanır: çerezler, çerezin kaynağına yönelik her istekle otomatik olarak gönderilir; Aynı Kaynak İlkesi (Same-Origin Policy), JavaScript'in yanıtlara okuma erişimini düzenler ancak tarayıcının çapraz kaynaklı istekler göndermesini engellemez.
- Kimlik doğrulama: Kurban, bir hedef uygulamaya (örn. bir bankacılık sitesi) giriş yapar ve tarayıcıda saklanan bir oturum çerezi alır.
- Tuzak: Oturum hâlâ aktifken kurban, kötü amaçlı bir sayfayı ziyaret eder veya ziyaret etmesi için kandırılır (hazırlanmış e-posta, üçüncü taraf web sitesi veya enjekte edilmiş reklam).
- Sahte istek: Kötü amaçlı sayfa, tarayıcının hedef uygulamaya istek göndermesine neden olan işaretleme veya komut dosyası içerir; hazırlanmış
srcözniteliğine sahip bir<img>etiketi, JavaScript otomatik gönderimi olan gizli bir HTML formu ya da uygun CORS ön uçuş atlamasıyla birfetch()çağrısı bu yöntemler arasında sayılabilir. - Kimlik bilgisi ekleme: Tarayıcı, oturum çerezini (ve HTTP Basic/Digest kimlik bilgilerini) giden isteğe otomatik olarak ekler.
- Eylemin gerçekleştirilmesi: Hedef uygulama, geçerli kimlik bilgilerini görüp isteği kasıtlı yapılmış gibi işler.
İstismar edilebilirliği etkileyen temel teknik faktörler:
- HTTP yöntemi: GET tabanlı durum değişiklikleri,
<img src>veya<link href>aracılığıyla önemsiz biçimde istismar edilebilir. POST tabanlı işlemler bir form veya fetch gerektirir ancak yalın HTML ile yine de istismar edilebilir. - Content-Type kısıtlamaları:
application/jsonPOST istekleri normalde CORS ön uçuşunu tetikler; tarayıcı bunu çapraz kaynaklı isteklerde izin vermeyen uç noktalara karşı engeller. Ancaktext/plainveyamultipart/form-dataön uçuşu tetiklemez ve JSON benzeri yükler taşıyabilir. - Çerez öznitelikleri:
SameSiteözniteliğinin bulunmaması (veyaSameSite=Nonekullanımı), çerezlerin tüm çapraz site istekleriyle gönderilmesi anlamına gelir ve saldırı yüzeyini genişletir. - Alt alan adı güveni: Alt alan adları çerezleri paylaşıyorsa (geniş
Domainözniteliği) ele geçirilmiş bir alt alan adı, ana uygulamaya karşı bir CSRF yükü sunabilir.
İş etkisi
Başarılı bir CSRF saldırısı, kurbanın tam ayrıcalıklarıyla rastgele durum değiştiren işlemleri gerçekleştirir. Somut sonuçlar şunlardır:
- Hesap ele geçirme: Saldırgan, kurbanın e-posta adresini veya parolasını değiştirerek onu kilitler ve tam denetim elde eder.
- Finansal dolandırıcılık: Ödeme destekli uygulamalarda yetkisiz para transferleri, satın alımlar veya abonelik değişiklikleri.
- Veri imhası veya sızıntı kurulumu: Kayıtları silme, veri paylaşım ayarlarını değiştirme veya saldırganın denetimindeki bir yönetici hesabı ekleme.
- Ayrıcalık yükseltme: Saldırgana uygulama içinde yüksek roller verilmesi.
- Yasal ve düzenleyici yükümlülükler: Kişisel veya finansal verilerin yetkisiz işlenmesi, GDPR, PCI DSS veya diğer çerçeveler kapsamında yükümlülükler doğurabilir.
- İtibar kaybı: Açıklanamayan hesap değişiklikleri yaşayan kullanıcılar platforma olan güvenini kaybeder.
Nasıl düzeltilir?
- Senkronizatör Belirteç Deseni (birincil savunma): Kriptografik olarak rastgele, oturum başına (veya istek başına) bir belirteç oluşturun ve bunu her durum değiştiren HTML formuna gizli bir alan olarak ya da AJAX için özel bir HTTP başlığı (
X-CSRF-Token) olarak ekleyin. Belirteci her değiştiren istekte sunucu tarafında doğrulayın. Belirteçler tahmin edilemez olmalı (en az 128 bit entropi) ve oturuma bağlı olmalıdır. - Çift Gönderim Çerezi: Rastgele bir değeri hem çereze hem de bir istek parametresine (veya başlığa) ayarlayın. Bunların eşleştiğini sunucu tarafında doğrulayın. Bu yöntem, alt alan adı çerez enjeksiyonu mümkünse senkronizatör deseninden daha zayıftır; ancak durumsuz mimariler için kullanışlıdır.
- SameSite Çerez Özniteliği: Oturum çerezlerine
SameSite=StrictveyaSameSite=Laxayarlayın.Strict, tüm çapraz site isteklerinde çerezi engeller.Lax(2020'den bu yana çoğu tarayıcıda varsayılan), çapraz site alt kaynak ve form POST isteklerinde çerezi engeller; üst düzey gezintilere ise izin verir. Bu öznitelik tek başına tam bir savunma değildir — derinlemesine savunma katmanı olarak kullanılmalıdır. - Origin veya Referer başlığını doğrulayın: Sunucuda,
Originbaşlığının (tercih edilir) veyaRefererbaşlığının beklenen kaynaklı eşleştiğini kontrol edin. Beklenmedik kaynaklardan gelen istekleri reddedin. Proxy'ler tarafından başlık kaldırma ve doğrudan gezintilerde eksik başlıklara karşı dikkatli olun. - AJAX için özel istek başlıkları kullanın: Tüm AJAX tabanlı durum değişiklikleri için özel bir başlık (örn.
X-Requested-With: XMLHttpRequest) zorunlu kılın. Çapraz kaynaklı istekler, CORS ön uçuşu olmadan rastgele başlıklar ayarlayamaz; sunucu bu ön uçuşu reddedebilir. - GET tabanlı durum değişikliklerini ortadan kaldırın: HTTP GET isteklerinin idempotent olmasını sağlayın ve sunucu durumunu asla değiştirmemelerini garantileyin. Tüm değişiklikler için REST anlambilimine uygun olarak POST, PUT, PATCH veya DELETE kullanın.
- Hassas işlemler için yeniden kimlik doğrulama isteyin: Yüksek etkili eylemler (parola değiştirme, ödeme, ayrıcalık verme) için kullanıcılardan CSRF belirteçlerinden bağımsız olarak parolalarını yeniden girmelerini veya ikinci bir faktörü tamamlamalarını isteyin.
- CORS politikasını doğru uygulayın: Kısıtlayıcı bir CORS politikası, çapraz kaynaklı JavaScript'in yanıtları okumasını engeller; ancak basit çapraz kaynaklı isteklerin gönderilmesini engellemez. CORS'u CSRF savunması olarak kullanmayın.
- Çerçeve varsayılanları: Özel belirteç mantığı uygulamak yerine web çerçevenizin yerleşik CSRF korumasını kullanın (Django'nun
CsrfViewMiddleware'i, Laravel'inVerifyCsrfToken'i, Spring Security'ninCsrfFilter'i, Rails'inprotect_from_forgery'si vb.).