XSS
Siteler Arası Betik Çalıştırma (Cross-Site Scripting)
Kısaca
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 nedir?
Cross-site scripting, bir web uygulamasının yorum, arama terimi ya da URL parametresi gibi güvenilmeyen verileri önce güvenli hâle getirmeden sayfaya eklemesiyle ortaya çıkar. Tarayıcı, saldırganın betiğini sitenin kendi kodundan ayıramaz ve onu gerçek sitenin sahip olduğu izinlerle çalıştırır.
Betik çalışmaya başladığında sayfadaki verileri okuyabilir, oturum açmış kullanıcı gibi davranabilir, kullanıcının gördüklerini değiştirebilir ya da saldırgana bilgi gönderebilir. XSS üç ana biçimde görülür: yükün veritabanına kaydedilip her ziyaretçiye gösterildiği stored XSS, arama URL'si gibi bir istekten yansıtıldığı reflected XSS ve ön yüz JavaScript'inin güvenilmeyen veriyi sayfaya eklediği DOM-based XSS.
Temel savunma çıktı kodlamasıdır (output encoding): < ve > gibi özel karakterleri, veri HTML'e eklenmeden önce zararsız metne dönüştürmek. React, Vue ve Angular gibi framework'ler bunu varsayılan olarak yapar. Kullanıcı verisiyle innerHTML veya dangerouslySetInnerHTML gibi ham HTML alıcılarından kaçının, izin vermeniz gereken HTML'i iyi test edilmiş bir sanitizer kütüphanesiyle temizleyin ve hangi betiklerin çalışabileceğini kısıtlayan bir Content Security Policy (CSP) başlığı ekleyin. Oturum çerezlerini HttpOnly olarak işaretlemek, çerezleri betiklerin erişiminden uzak tutarak zararı sınırlar.
XSS sıklıkla CSRF ile karıştırılır. XSS'te saldırganın kodu güvenilir sitenin içinde çalışır; CSRF'te ise saldırganın kendi sitesi tarayıcıyı, güvenilir siteye istek göndermesi için kandırır. Bir XSS açığı, çoğu CSRF savunmasını da işlevsiz bırakabilir.
Bir bakışta
Önemli noktalar
- XSS, saldırganın sağladığı betiklerin diğer kullanıcıların tarayıcısında çalışmasına izin verir.
- Güvenilmeyen verinin kodlanmadan sayfalara eklenmesinden kaynaklanır.
- Üç ana türü stored, reflected ve DOM-based XSS'tir.
- Çıktı kodlaması, güvenli DOM API'leri, sanitization ve CSP ile savunun.
HttpOnlyçerezler, başarılı bir saldırının etkisini azaltır.
Örnek
const comment = getCommentFromUser(); // e.g. <img src=x onerror=alert(1)>
// Vulnerable: the browser parses the text as HTML and runs the script
commentBox.innerHTML = comment;
// Safe: the input is treated as plain text, never as HTML
commentBox.textContent = comment;Sık sorulan sorular
XSS ile CSRF arasındaki fark nedir?
XSS, güvenilir bir web sitesine kötü amaçlı betik enjekte eder ve bu betik kurbanların tarayıcısında çalışır. CSRF ise kurbanın tarayıcısını, oturum açtığı bir siteye istenmeyen bir istek göndermesi için kandırır; o sitede herhangi bir kod çalıştırmaz.
React, XSS'i engeller mi?
React, JSX ile eklenen değerleri varsayılan olarak escape eder ve bu, en yaygın XSS durumlarını engeller. Yine de dangerouslySetInnerHTML, javascript: URL'leri gibi güvensiz href değerleri ya da güvenilmeyen üçüncü taraf kodlarla zafiyet oluşturabilirsiniz.
Content Security Policy nedir?
Content Security Policy, tarayıcıya hangi betik, stil ve diğer kaynakların yüklenebileceğini söyleyen bir HTTP yanıt başlığıdır. Sıkı bir politika, XSS açığı olsa bile enjekte edilen betiklerin çalışmasını engelleyebilir.
Sık karşılaştırılanlar
- XSS vs CSRFXSS, 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.
- SQL Injection vs XSSSQL injection sunucuya saldırganın veritabanı komutlarını çalıştırtır; XSS ise saldırganın JavaScript'ini başka kullanıcıların tarayıcısında çalıştırır.
İlgili sayfalar
- CSRFGüvenlik, s. 5CSRF, 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.
- Content Security PolicyGüvenlik, s. 4Content Security Policy, tarayıcıya sayfanın hangi betik, stil ve kaynakları yükleyebileceğini bildirip enjekte edilen kodu engelleyen HTTP yanıt başlığıdır.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- DOMWeb Geliştirme, s. 14DOM, tarayıcının bir web sayfasını temsil eden ve JavaScript'in okuyup değiştirerek kullanıcının gördüğünü güncelleyebildiği bellek içi nesne ağacıdır.
- CookieWeb Geliştirme, s. 7Cookie, bir web sitesinin tarayıcıdan saklamasını ve sonraki isteklerle geri göndermesini istediği, çoğunlukla oturum açık tutmak için kullanılan küçük veridir.
- SQL InjectionGüvenlik, s. 39SQL injection, kullanıcı girdisinin veritabanı sorgusunun parçası sayıldığı ve saldırganın erişmemesi gereken verileri okuyup değiştirebildiği saldırıdır.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin