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.
Ön koşullar
Section titled “Ön koşullar”- İş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.
PoC — otomatik gönderilen form
Section titled “PoC — otomatik gönderilen form”<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.
Yaygın atlatma senaryoları
Section titled “Yaygın atlatma senaryoları”-
Token doğrulaması yönteme bağlı — POST’ta zorunlu token, GET’te yoksa isteği GET’e çevir.
-
Token oturumla bağlı değil — kendi hesabından geçerli CSRF token alıp kurbana kullandır (token reuse).
-
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ış).
-
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.
-
Referer / Origin kontrolü zayıf — boş Referer kabulü ( meta referrer no-referrer ), alt dizin / subdomain allow-list hatası ( https://hedef.example.attacker.com ).
-
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>
login / logout CSRF
Section titled “login / logout CSRF”<!-- 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 ile ilişki
Section titled “XSS ile ilişki”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.
Test checklist
Section titled “Test checklist”□ 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)