Genel Bakış
Kalıcı Cross-Site Scripting (Stored XSS), bir web uygulamasının kullanıcı denetimindeki girdiyi yeterli temizleme yapmadan bir arka uç veri deposuna (veritabanı, günlük dosyası, mesaj kuyruğu vb.) kaydetmesi ve ardından bu veriyi uygun çıktı kodlaması olmaksızın HTTP yanıtında işlemesi durumunda ortaya çıkar. Kötü niyetli yükün bir URL'ye gömüldüğü ve tek bir gidip-gelmede çalıştırıldığı Yansıtılan XSS'den farklı olarak, Stored XSS yükleri kalıcıdır: etkilenen sayfayı görüntüleyen her kullanıcının tarayıcısı, çoğunlukla yalnızca sayfayı ziyaret ederek, enjekte edilen betiği çalıştırır.
Stored XSS, CWE-79 (Web Sayfası Oluşturma Sırasında Girdinin Uygunsuz Nötrleştirilmesi) kapsamında sınıflandırılır ve OWASP Top 10 A03:2021 – Enjeksiyon ile eşleşir. Saldırı kendi kendine yayılan bir yapıya sahip olduğundan ve kurbanın özel hazırlanmış bir bağlantıya tıklamasını gerektirmediğinden, genellikle Yansıtılan XSS'den daha tehlikeli kabul edilir.
Nasıl Çalışır?
Saldırı yaşam döngüsü üç ayrı aşamadan oluşur:
- Enjeksiyon: Saldırgan, uygulamanın kabul ettiği herhangi bir girdi yüzeyi (yorum alanları, kullanıcı profilleri, ürün incelemeleri, dosya adları, günlüklerde saklanan HTTP başlıkları vb.) aracılığıyla genellikle bir
<script>etiketi, olay işleyici niteliği veya kodlanmış bir varyant olan bir yük gönderir. - Kalıcılık: Uygulama, temizlenmemiş yükü bir veri deposuna kaydeder. Bu noktadan itibaren yük, gelecekteki her ziyaretçi için çalışmaya hazır bekler.
- Çalıştırma: Meşru bir kullanıcı (veya yönetici) depolanan veriyi içeren sayfayı talep ettiğinde, sunucu yükü HTML yanıtına ekler. Tarayıcı, enjekte edilen betiği meşru uygulama kodundan ayırt edemediğinden, köken (origin) bağlamında çalıştırır.
Temel teknik özellikler:
- Çalıştırma, kurbanın tarayıcısında uygulamanın kökeni altında gerçekleşir; bu da betiğe çerezlere (oturum belirteçleri dahil), localStorage'a, sessionStorage'a ve DOM'a erişim sağlar.
- Yükler oturum çerezlerini saldırgan kontrolündeki bir sunucuya sızdırabilir, kurban adına eylemler gerçekleştirebilir (CSRF eşdeğeri), kullanıcıları kimlik avı sayfalarına yönlendirebilir veya zararlı yazılım indirilmesini tetikleyebilir.
- Naif girdi filtrelerini atlatmak için çok dilli (polyglot) yükler ve kodlama hileleri (HTML varlıkları, Unicode kaçışları, base64, SVG vektörleri, CSS ifadeleri) yaygın olarak kullanılır.
- İkinci aşamalı XSS, depolanan verilerin daha sonra farklı bir sayfa veya bağlamda—genellikle bir bakım ya da yönetim arayüzünde—güvensiz biçimde dahil edildiği bir varyanttır ve standart testlerde keşfedilmesi daha güçtür.
HttpOnlyçerez bayrağı, JavaScript'in çerezleri doğrudan okumasını engeller; ancak XSS yoluyla gerçekleştirilebilen tüm oturum ele geçirme sınıflarını (örneğin, kimliği doğrulanmış isteklerin sahte olarak oluşturulması) engellemez.
İş Etkisi
Stored XSS, etkilenen her ziyaretçi için otomatik olarak çalıştığından, patlama yarıçapı güvenliği ihlal edilmiş sayfanın trafiğiyle orantılı olarak büyür. Belgelenmiş sonuçlar şunlardır:
- Hesap ele geçirme:
document.cookiesızdırma yoluyla elde edilen oturum belirteçleri, saldırganların kurbanların şifrelerini bilmeden onları taklit etmesine olanak tanır. - Kimlik bilgisi toplama: Enjekte edilen betikler, oturum açma formlarının üzerine yazabilir veya düz metin kimlik bilgilerini toplamak için sahte kimlik doğrulama iletişim kutuları ekleyebilir.
- Ayrıcalık yükseltme: Bir yönetici etkilenmiş bir sayfayı görüntülediğinde, saldırgan tüm uygulamayı tehlikeye atacak şekilde yönetici düzeyinde erişim elde edebilir.
- Kötü amaçlı yazılım dağıtımı: Betikler, kullanıcıları sessizce exploit kitlerına yönlendirebilir veya zararlı yazılım indirilmesini tetikleyebilir.
- Düzenleyici maruziyet: Kişisel verilere yetkisiz erişim, GDPR, KVKK, HIPAA, PCI DSS ve benzer çerçeveler kapsamında ihlal bildirimleri ve para cezaları doğurabilir.
- İtibar hasarı: Kamuoyuna mal olmuş XSS olayları, özellikle e-ticaret, bankacılık ve sağlık hizmetleri platformlarında kullanıcı güvenini zedeler.
- Veri bütünlüğünün bozulması: Betikler ekrandaki içeriği değiştirebilir ve kullanıcıların sahte bilgilere (örneğin, manipüle edilmiş finansal rakamlar) dayalı kararlar almasına yol açabilir.
Nasıl Giderilir?
Savunma, birden fazla katmanda kontrol gerektirir. Tek bir önlem tek başına yeterli değildir.
- Bağlama duyarlı çıktı kodlaması: Kullanıcı tarafından sağlanan tüm veriler, depolama noktasında değil, işleme noktasında kodlanmalıdır. Çıktı bağlamına uygun kodlama kullanın: HTML gövdesi/nitelikleri için HTML varlık kodlaması, satır içi betikler için JavaScript dize kaçışı, href/src nitelikleri için URL kodlaması, stil bağlamları için CSS kaçışı. OWASP Java Encoder, Microsoft AntiXSS veya framework'e özgü şablonlama motorları (React'ın JSX'i, Angular'ın interpolasyonu, Django'nun otomatik kaçışı) gibi kütüphaneler doğru kullanıldığında bunu otomatik olarak uygular.
- Girdi doğrulama ve temizleme: Beklenen biçimlere uymayan girdiyi reddedin veya temizleyin. Zengin metin (HTML) kabul etmesi gereken alanlar için iyi bakımı yapılan bir izin listesi tabanlı HTML temizleme kütüphanesi kullanın (örneğin, istemci tarafı için DOMPurify, Python için bleach, .NET için HtmlSanitizer). Engel listesi yaklaşımları, kodlama atlatma tekniklerine karşı yetersizdir.
- İçerik Güvenlik Politikası (CSP): Satır içi betikleri (
'unsafe-inline') yasaklayan ve betik kaynaklarını güvenilir kaynaklarla sınırlayan katı bir CSP başlığı (Content-Security-Policy) dağıtın. Meşru satır içi betikler için nonce veya hash kullanan bir politika en güçlü korumayı sağlar. CSP, derinlemesine savunma kontrolüdür ve sunucu tarafı düzeltmelerin yerine geçmemelidir. - HttpOnly ve Secure çerez bayrakları: JavaScript erişimini engellemek için tüm oturum çerezlerinde
HttpOnlyayarını yapın. Yalnızca HTTPS üzerinden iletimi zorlamak içinSecurebayrağını etkinleştirin. - Alt Kaynak Bütünlüğü (SRI): Dışarıdan yüklenen betikler için, müdahaleyi tespit etmek amacıyla SRI hash'leri kullanın.
- Trusted Types API: Modern tarayıcılarda, DOM enjeksiyon havuzlarının ham dize kabul etmesini engellemek için Trusted Types API'sini (
require-trusted-types-for 'script') zorunlu kılın. - Güvenlik kod incelemesi ve DAST: Statik analiz (SAST) hatlarına XSS test senaryoları ekleyin ve tüm girdi yüzeylerinde dinamik uygulama güvenlik testi (DAST) gerçekleştirin. Sensagraph, sürekli tarama sırasında Stored XSS güvenlik açıklarını otomatik olarak tespit eder.
- Web Uygulaması Güvenlik Duvarı (WAF): Bir WAF, bilinen XSS kalıpları için ikincil bir tespit ve engelleme katmanı sağlayabilir; ancak birincil kontrol olmamalıdır.
Referanslar
- OWASP Top 10 A03:2021 – Enjeksiyon
- OWASP – Cross-Site Scripting (XSS)
- OWASP XSS Önleme Hızlı Başvuru Kılavuzu
- OWASP DOM Tabanlı XSS Önleme Hızlı Başvuru Kılavuzu
- MITRE CWE-79 – Web Sayfası Oluşturma Sırasında Girdinin Uygunsuz Nötrleştirilmesi
- MDN – İçerik Güvenlik Politikası (CSP)
- W3C – İçerik Güvenlik Politikası Düzey 3
- MDN – Trusted Types API
- DOMPurify – Güvenilir HTML Temizleme Kütüphanesi