Web uygulamaları geliştikçe kullanıcı etkileşimi artmış, bu durum istemci tarafında çalışan kodların güvenliğini daha kritik hale getirmiştir. İnternet dünyasında en sık karşılaşılan web zafiyetlerinden biri olan XSS (Cross-Site Scripting), saldırganların güvenilir web siteleri üzerinden kurbanların tarayıcılarında kötü amaçlı kod çalıştırmasına zemin hazırlar. Web güvenliği alanında temel bir kavram olan xss nedir sorusunu anlamak, hem geliştiricilerin güvenli kod yazması hem de güvenlik uzmanlarının sistemleri denetlemesi açısından kritik bir adımdır.
XSS Nedir ve Nasıl Çalışır?
Cross-Site Scripting (XSS), bir web uygulamasının kullanıcıdan aldığı veriyi yeterince filtrelemeden veya doğrulamadan doğrudan web sayfasına dahil etmesi sonucu ortaya çıkan bir zafiyettir. Bu açık sayesinde saldırgan, HTML veya JavaScript gibi istemci taraflı betikleri hedef kullanıcının tarayıcısında çalıştırabilir.
Normal şartlarda tarayıcılar, Aynı Köken Politikası (Same-Origin Policy – SOP) gereği farklı kaynaklardan gelen betiklerin birbirlerinin verilerine erişmesini engeller. Ancak XSS saldırısında zararlı kod doğrudan hedeflenen web sitesinin bir parçasıymış gibi tarayıcıya iletildiğinden, tarayıcı bu kodu güvenilir kabul eder. Kod kurbanın tarayıcısında çalıştığında saldırgan oturum çerezlerini çalabilir, oturumu ele geçirebilir (session hijacking), sahte formlar ile kimlik bilgilerini toplayabilir veya kullanıcı adına istekler gönderebilir.
XSS Türleri Nelerdir?
XSS saldırıları, kötü amaçlı kodun sisteme nasıl iletildiğine ve nerede depolandığına bağlı olarak üç temel kategoriye ayrılır.
1. Reflected (Yansıyan) XSS
Reflected XSS, zararlı betiğin doğrudan HTTP isteği (çoğunlukla GET parametresi) ile gönderildiği ve sunucudan dönen yanıtta anında geri yansıtıldığı durumdur. Bu saldırı türünde zararlı kod veritabanında saklanmaz. Saldırgan, hazırladığı zararlı parametreleri içeren bir bağlantıyı (URL) kurbana e-posta, mesajlaşma veya sosyal mühendislik yöntemleriyle tıklatır.
2. Stored (Kalıcı) XSS
XSS türleri arasında en tehlikeli olanlardan biridir. Zararlı kod sunucu tarafında; genellikle bir veritabanında, yorum alanında, profil bilgisinde veya mesaj panosunda kalıcı olarak depolanır. İlgili sayfayı ziyaret eden her masum kullanıcı, sunucunun veritabanından çektiği bu zararlı betiği tarayıcısında çalıştırır. Saldırganın tek bir payload yerleştirmesi, sayfayı ziyaret eden yüzlerce veya binlerce kullanıcının etkilenmesine yol açabilir.
3. DOM-based XSS
DOM-based XSS durumunda açık, sunucu tarafındaki bir kod hatasından değil, istemci tarafındaki JavaScript kodlarının güvensiz DOM (Document Object Model) manipülasyonundan kaynaklanır. Sayfadaki JavaScript, URL parçası (hash veya search parametreleri gibi) kullanıcı girdilerini alıp güvenli olmayan metotlarla sayfaya yazdırdığında tetiklenir. Bu senaryoda zararlı payload bazen sunucuya hiç iletilmeden yalnızca tarayıcı üzerinde işlenir.
Uygulamalı Kod Senaryoları
Bir açığın mantığını kavramanın en etkili yolu, zafiyet barındıran kod yapısı ile güvenli hali arasındaki farkı görmektir.
Zafiyet Barındıran PHP Örneği
Aşağıdaki örnekte kullanıcıdan alınan arama terimi hiçbir filtreleme uygulanmadan doğrudan sayfaya yazdırılmaktadır:
<?php
// Gelen arama parametresi kontrolsüz şekilde ekrana basılıyor
$search = $_GET['q'];
echo "<div>Arama sonucu: " . $search . "</div>";
?>
Saldırgan, arama kutusuna veya URL parametresine şu payload’u girdiğinde:
<script>alert('XSS Açığı!');</script>
Tarayıcı bu metni saf metin olarak değil, çalıştırılabilir bir betik olarak yorumlar ve ekranda uyarı penceresi açılır.
Güvenli Hale Getirilmiş PHP Kodu
Kullanıcı girdisini ekrana basmadan önce HTML karakterlerini zararsız karşılıklarına dönüştürmek (HTML entity encoding) gerekir:
<?php
$search = $_GET['q'];
// htmlspecialchars fonksiyonu < ve > gibi karakterleri < ve > haline getirir
$safe_search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');
echo "<div>Arama sonucu: " . $safe_search . "</div>";
?>
Bu kod çalıştığında tarayıcı <script> etiketini bir kod bloğu olarak çalıştırmaz, ekranda düz yazı olarak görüntüler.
Zafiyet Barındıran JavaScript (DOM) Örneği
İstemci tarafında DOM güncellenirken güvensiz fonksiyonların kullanılması DOM XSS açığı yaratır:
// URL parametresini alıp innerHTML ile ekrana yazan güvensiz yapı
const urlParams = new URLSearchParams(window.location.search);
const userName = urlParams.get('name');
document.getElementById('welcome-message').innerHTML = "Hoş geldin " + userName;
Eğer name parametresine zararlı bir HTML/JS kodu geçilirse, innerHTML bu kodu yorumlar.
Güvenli JavaScript DOM Kullanımı
Kullanıcıdan gelen veri doğrudan HTML yapısını değiştirmeyecek şekilde atanmalıdır:
const urlParams = new URLSearchParams(window.location.search);
const userName = urlParams.get('name');
// textContent veriyi salt metin olarak işler, kod yürütülmesini engeller
document.getElementById('welcome-message').textContent = "Hoş geldin " + userName;
XSS Saldırılarından Korunma Yöntemleri
XSS açıklarını tamamen engellemek tek bir yönteme dayanmaz, katmanlı bir savunma yaklaşımı gerektirir.
- Girdi Doğrulama (Input Validation): Sisteme giren tüm kullanıcı verileri belirli kurallara göre (tür, uzunluk, format) doğrulanmalıdır. Beklenmeyen formatlar doğrudan reddedilmelidir.
- Çıktı Kodlama (Output Encoding / Escaping): Verinin tarayıcıya basıldığı bağlama (HTML gövdesi, HTML niteliği, JavaScript değişkeni, CSS) uygun kodlama yapılmalıdır.
- Güvenli Fonksiyonların Tercihi: JavaScript tarafında
innerHTML,outerHTMLveyadocument.writeyerinetextContentveinnerTexttercih edilmelidir. - Content Security Policy (CSP): Sunucu tarafından gönderilen HTTP başlıklarıyla tarayıcının hangi kaynaklardan betik yükleyebileceği katı kurallarla sınırlandırılmalıdır.
- HttpOnly Bayrağı Kullanımı: Oturum çerezlerine (session cookies)
HttpOnlyözelliği tanımlanmalıdır. Bu sayede tarayıcıda bir XSS çalışsa dahi JavaScriptdocument.cookieüzerinden oturum anahtarına erişemez.
Özet ve Sonraki Adımlar
XSS, istemci tarafı kod çalıştırma yeteneği sunarak kullanıcı oturumlarının çalınmasına ve web sitelerinin manipüle edilmesine yol açan kritik bir zafiyettir. Geliştiriciler, kullanıcı girdilerine asla güvenmemeli, girdi doğrulama ve bağlama duyarlı çıktı kodlama kurallarını yazılım süreçlerinin merkezine yerleştirmelidir.
Sonraki adım olarak, Content Security Policy (CSP) başlıklarının nasıl yapılandırıldığını inceleyebilir ve tarayıcı düzeyindeki güvenlik mekanizmalarını projelerinize entegre etmeye başlayabilirsiniz.


Comments
No comments yet. Write the first comment.