Skip to content

Latest commit

 

History

History
100 lines (78 loc) · 4.74 KB

12.md

File metadata and controls

100 lines (78 loc) · 4.74 KB

Cross-Site Request Forgery (CSRF) Nedir?


Tanım ve Temel Kavramlar

Cross-Site Request Forgery (CSRF), bir kullanıcının kimliğinin yetkili olduğu bir web uygulamasında, kullanıcının bilgisi dışında istenmeyen işlemler gerçekleştirmesini sağlayan bir saldırı türüdür. Saldırgan, kullanıcıyı (örneğin, bir bağlantıya tıklatarak veya zararlı bir web sayfasını ziyaret ettirerek) hedef uygulamaya oturum açmış haldeyken bir istek göndermeye zorlar. Tarayıcı, oturum çerezlerini otomatik olarak eklediği için sunucu bu isteği geçerli bir talep olarak kabul eder.

Teknik Terimler:

  • Oturum Çerezi (Session Cookie): Kullanıcının kimliğini doğrulayan ve sunucu tarafından atanan bir tanımlayıcı.
  • SameSite Çerezleri: Çerezlerin yalnızca aynı site bağlamında gönderilmesini sağlayan bir güvenlik özelliği.
  • Referer Header: Bir isteğin hangi URL’den geldiğini gösteren HTTP başlığı.

Saldırı Mekanizması: Adım Adım

  1. Kullanıcı Oturum Açar: Kullanıcı, bank.com gibi bir siteye giriş yapar ve oturum çerezi tarayıcıya kaydedilir.
  2. Saldırganın Tuzağı: Kullanıcı, saldırganın kontrol ettiği bir sayfayı (evil.com) ziyaret eder veya zararlı bir bağlantıya tıklar.
  3. Zararlı İstek Gönderilir: Bu sayfada, bank.com/transfer?amount=1000&to=attacker gibi bir isteği otomatik olarak tetikleyen bir form veya script bulunur.
    <form action="https://bank.com/transfer" method="POST">
      <input type="hidden" name="amount" value="1000">
      <input type="hidden" name="to" value="attacker">
    </form>
    <script>document.forms[0].submit();</script>
  4. Tarayıcı Çerezi Ekler: Tarayıcı, bank.com için geçerli oturum çerezini isteğe ekler.
  5. Sunucu İşlemi Onaylar: Sunucu, çerezi doğrular ve para transferini gerçekleştirir.

Örnek Senaryolar

Örnek 1: GET İsteği ile CSRF

Zayıf bir uygulama, e-posta değişikliğini GET isteğiyle işliyorsa:

<img src="https://site.com/change-email?new_email=attacker@evil.com" width="0" height="0">

Kullanıcı bu görsele sahip bir sayfayı açtığında, tarayıcı otomatik olarak GET isteği gönderir.

Örnek 2: POST İsteği ve Gizli Form

Saldırgan, kullanıcıyı otomatik submit eden bir form içeren bir sayfaya yönlendirir:

<body onload="document.forms[0].submit()">
  <form action="https://bank.com/transfer" method="POST">
    <!-- Gizli input'lar -->
  </form>
</body>

Savunma Teknikleri

1. CSRF Tokenları
  • Nasıl Çalışır? Sunucu, her kullanıcı oturumu için benzersiz bir token oluşturur ve bunu formlara ekler. İstek geldiğinde token doğrulanır.
  • Uygulama Örneği (PHP):
    // Token oluşturma ve session'a kaydetme
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    
    // Formda gösterim
    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
    
    // Doğrulama
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
      die("Geçersiz token!");
    }
2. SameSite Çerez Özelliği
  • Nasıl Çalışır? Çerezlerin SameSite=Lax veya Strict olarak ayarlanması, başka sitelerden gelen isteklerde çerezlerin gönderilmesini engeller.
  • Örnek Cookie Ayarları:
    Set-Cookie: session_id=123; SameSite=Lax; Secure
3. Referer Header Kontrolü
  • Sunucu, gelen isteğin Referer başlığını kontrol ederek isteğin geçerli bir kaynaktan gelip gelmediğini doğrular. Ancak bazı tarayıcılar veya gizlilik eklentileri bu başlığı kaldırabilir.

Karşılaşılabilecek Zorluklar ve Çözümler

  1. Zorluk: Token’ların XSS ile çalınması.

    • Çözüm: XSS açıklarını kapatmak için çıktıları temizleme (HTML escape) ve HttpOnly çerezler kullanma.
  2. Zorluk: Legacy sistemlerde SameSite desteğinin olmaması.

    • Çözüm: CSRF tokenları ile birlikte Referer kontrolü uygulama.
  3. Zorluk: API’larda CSRF koruması.

    • Çözüm: Bearer token (JWT) kullanımı ve token’ların Authorization header’ı ile gönderilmesi.

Pratik Öneriler

  • Framework Kullanımı: Django, Rails, Spring Security gibi framework’ler yerleşik CSRF koruması sağlar.
  • Çok Katmanlı Savunma: Token + SameSite + Referer kontrolü kombinasyonu.
  • Eğitim: Geliştiricilere güvenli kodlama eğitimi verilmesi.

Sonuç

CSRF, oturum çerezlerinin kötüye kullanılmasına dayanan kritik bir güvenlik açığıdır. Token tabanlı koruma ve modern çerez politikalarıyla etkili şekilde önlenebilir. Savunmaların proaktif olarak uygulanması ve düzenli güvenlik testleri, riski en aza indirir.