Siteler Arası Betik Çalıştırma (XSS – Cross-Site Scripting)
Web Uygulamalarında Sessiz Tehlike ve Korunma Yöntemleri
Modern web uygulamaları; kullanıcı yorumları, arama kutuları, giriş formları ve dinamik içerikler sayesinde oldukça etkileşimli hale gelmiştir. Ancak bu etkileşim, doğru güvenlik kontrolleri uygulanmadığında ciddi riskleri de beraberinde getirir. Bu risklerin en yaygın ve tehlikeli örneklerinden biri Siteler Arası Betik Çalıştırma (Cross-Site Scripting – XSS) saldırılarıdır.
XSS, saldırganın bir web uygulamasına zararlı istemci tarafı kodlar (çoğunlukla JavaScript) enjekte ederek bu kodların başka kullanıcıların tarayıcısında çalışmasını sağlamasıdır. Buradaki önemli nokta, kodun doğrudan sunucuda değil, kurban kullanıcının tarayıcısında çalışmasıdır.
Uzun yıllardır web güvenliğinin temel problemlerinden biri olan XSS, hâlâ yanlış filtreleme, eksik doğrulama ve güvenli olmayan çıktı üretimi nedeniyle birçok sistemde görülebilmektedir.
XSS Nedir?
XSS (Cross-Site Scripting), bir web uygulamasının kullanıcı girdilerini güvenli şekilde işlemeden sayfa içerisinde göstermesi sonucu ortaya çıkan güvenlik açığıdır.
Basit ifadeyle:
Kullanıcının girdiği veri, güvenli hale getirilmeden HTML veya JavaScript olarak yorumlanır.
Bu durum saldırganın:
Zararlı script çalıştırmasına
Sayfa içeriğini değiştirmesine
Kullanıcı oturumlarını hedef almasına
Sahte formlar göstermesine
Güven ilişkisini kötüye kullanmasına
imkân tanıyabilir.
XSS Nasıl Çalışır?
XSS’in temel mantığı, tarayıcının güven modelini kötüye kullanmaktır.
Bir web sitesi genellikle kullanıcı girdilerini alır ve tekrar sayfada gösterir.
Örnek akış:
Kullanıcı veri girer
Sunucu girdiyi işler
Veri HTML içinde geri gösterilir
Tarayıcı içeriği yorumlar
Sorun şu noktada ortaya çıkar:
Eğer uygulama girdiyi sadece metin olarak değil de çalıştırılabilir kod olarak sunarsa, tarayıcı bunun zararlı olup olmadığını anlayamaz.
Tarayıcı açısından:
Kod site içerisinden gelmiş görünür
Güvenilir origin kapsamında çalışır
Kullanıcının oturum yetkilerini kullanabilir
Bu nedenle XSS tehlikelidir.
XSS Türleri
XSS saldırıları genellikle üç ana gruba ayrılır.
1. Stored XSS (Kalıcı XSS)
En tehlikeli XSS türlerinden biridir.
Zararlı içerik:
Veritabanına
Forum mesajına
Blog yorumuna
Profil alanına
kaydedilir.
Sonrasında bu içerik sayfayı ziyaret eden herkesin tarayıcısına gönderilir.
Örnek Senaryo
Bir forum düşünelim.
Yorum alanına zararlı kod kaydedilir.
Yorumu açan tüm kullanıcılar etkilenebilir.
Risk Neden Yüksek?
Çünkü:
Tek seferlik yerleştirme yeterlidir
Çok sayıda kullanıcı etkilenebilir
Yönetici hesapları hedef alınabilir
2. Reflected XSS (Yansıtılmış XSS)
Bu türde zararlı kod sunucuda saklanmaz.
Kod:
URL
Form verisi
Parametre
üzerinden gelir ve anlık olarak kullanıcıya geri yansıtılır.
Örnek Alanlar
Arama sayfaları
Hata mesajları
Filtreleme parametreleri
Geri bildirim ekranları
Saldırgan genellikle hazırlanmış bağlantılar kullanır.
Kurban bağlantıya tıkladığında kod tarayıcıda çalışabilir.
3. DOM-Based XSS
DOM-Based XSS daha modern web uygulamalarında görülür.
Burada problem:
Sunucu değil
İstemci tarafı JavaScript kodudur.
Sayfa, URL veya kullanıcı girdisini güvenli şekilde işlemeyip doğrudan DOM içerisine eklediğinde ortaya çıkabilir.
Özellikle:
SPA uygulamaları
Dinamik frontend yapıları
Yoğun JavaScript kullanan sistemler
daha dikkatli geliştirilmelidir.
XSS Nerelerde Görülür?
XSS yalnızca büyük platformlarda değil, küçük projelerde de görülebilir.
Yaygın örnekler:
Yorum Sistemleri
Kullanıcıların HTML içeriği girebildiği alanlar.
Arama Kutuları
Arama teriminin sonuç sayfasında gösterilmesi.
Profil Sayfaları
Hakkımda bölümü, biyografi alanı.
Mesajlaşma Sistemleri
HTML render edilen mesaj içerikleri.
Yönetim Panelleri
Yetersiz filtrelenen admin girişleri.
XSS Saldırılarının Etkileri
XSS yalnızca sayfaya yazı eklemekten ibaret değildir.
Sonuçları oldukça ciddi olabilir.
1. Oturum Bilgilerinin Hedeflenmesi
Tarayıcı oturumları:
session
authentication token
kullanıcı bilgileri
ile ilişkilidir.
Uygun güvenlik önlemleri yoksa saldırgan oturum güvenliğini hedef almaya çalışabilir.
2. Hesap Ele Geçirme Riski
Özellikle:
yönetici paneli
moderatör hesabı
kurumsal kullanıcı
hedeflenirse etki büyür.
3. Sahte İçerik Gösterme
XSS ile:
giriş formu
uyarı penceresi
ödeme ekranı
taklit edilebilir.
Bu durum sosyal mühendislikle birleştiğinde daha tehlikeli hale gelir.
4. Kullanıcıyı Zararlı Sayfalara Yönlendirme
Kullanıcı farkında olmadan:
sahte sitelere
phishing sayfalarına
güvenilmeyen içeriklere
yönlendirilebilir.
Laboratuvar Ortamında Güvenli Eğitim
XSS konusu öğrenilirken önemli ilke şudur:
Testler yalnızca izinli ve kontrollü ortamlarda yapılmalıdır.
Güvenli eğitim ortamları:
Yerel test sunucuları
Sanal makineler
Eğitim amaçlı güvenlik laboratuvarları
Bilerek zafiyet içeren demo uygulamalar
Bu yaklaşım:
hukuki sorunları önler
etik sınırları korur
güvenli öğrenme sağlar
XSS Açıkları Nasıl Tespit Edilir?
XSS tespiti hem manuel hem otomatik yöntemlerle yapılabilir.
Kod İncelemesi
Geliştirici şu soruları sormalıdır:
Kullanıcı girdisi nereden geliyor?
Nerede gösteriliyor?
HTML olarak mı işleniyor?
Escape uygulanıyor mu?
Güvenlik Testleri
Kontrol edilmesi gereken noktalar:
Form girişleri
URL parametreleri
Header verileri
JavaScript DOM işlemleri
Log ve İzleme
Bazı belirtiler:
beklenmeyen parametreler
anormal istekler
olağan dışı kullanıcı davranışı
olası sorunların işareti olabilir.
XSS’den Korunma Yöntemleri
Savunma katmanlı olmalıdır.
Tek bir yöntem yeterli değildir.
1. Input Validation
Kullanıcı girdisi:
beklenen formatta mı
gereksiz karakter içeriyor mu
izin verilen yapıya uyuyor mu
kontrol edilmelidir.
Ancak yalnızca input filtering yeterli değildir.
2. Output Encoding
En kritik savunmalardan biridir.
Veri:
HTML içinde
JavaScript içinde
URL içinde
attribute içinde
farklı biçimde encode edilmelidir.
Amaç:
Tarayıcının girdiyi kod değil metin olarak görmesini sağlamaktır.
3. HTML Escaping
Özel karakterler güvenli hale getirilmelidir.
Örneğin:
<>"'
doğrudan yorumlanmamalıdır.
Bu yöntem birçok XSS riskini azaltır.
4. Content Security Policy (CSP)
CSP modern güvenlik başlıklarından biridir.
Tarayıcıya:
hangi scriptlerin çalışabileceğini
hangi kaynaklara izin verileceğini
bildirir.
Örnek korumalar:
inline script kısıtlaması
dış kaynak kontrolü
script whitelist yaklaşımı
CSP tek başına çözüm değildir ancak güçlü bir savunma katmanıdır.
5. HttpOnly ve Secure Cookie
Cookie güvenliği önemlidir.
HttpOnly
Cookie'nin istemci scriptlerinden erişimini sınırlar.
Secure
Cookie'nin yalnızca HTTPS üzerinden iletilmesini destekler.
Frameworkler ve XSS Koruması
Modern frameworkler varsayılan olarak çeşitli korumalar sunar.
Ancak geliştirici bunları devre dışı bırakırsa risk oluşabilir.
Django
Django:
otomatik template escaping
güvenli render sistemi
sunmaktadır.
Elle HTML render edilirken dikkat edilmelidir.
ASP.NET Core
ASP.NET Core:
Razor encoding
otomatik HTML escaping
özelliklerine sahiptir.
Raw HTML kullanımı dikkat gerektirir.
React / Vue / Angular
Bu frameworkler:
DOM manipülasyonunu sınırlar
veri bağlama mekanizmalarında koruma sağlar
Ancak güvenli olmayan render yöntemleri hâlâ risk oluşturabilir.
Geliştiriciler İçin Güvenlik Kontrol Listesi
Yayın öncesi şu sorular sorulmalıdır:
✅ Kullanıcı girdileri doğrulanıyor mu?
✅ Output encoding uygulanıyor mu?
✅ CSP yapılandırılmış mı?
✅ Cookie güvenliği aktif mi?
✅ Framework korumaları devrede mi?
✅ Güvenlik testleri yapıldı mı?
Sonuç
XSS, web güvenliğinin en yaygın ve etkili tehditlerinden biridir. Çoğu zaman karmaşık saldırılardan değil, basit ama ihmal edilmiş kodlama hatalarından kaynaklanır.
Güvenli web geliştirme yaklaşımı:
girdiyi doğrulamak,
çıktıyı güvenli üretmek,
modern güvenlik politikalarını uygulamak,
düzenli test yapmak
üzerine kurulmalıdır.
Unutulmamalıdır ki güvenlik, sonradan eklenen bir özellik değil; yazılım geliştirme sürecinin temel bir parçasıdır.
Pratik Yapma Zamanı: Yasal ve Güvenli Test Ortamları
Teoriyi pratiğe dökmek siber güvenliği öğrenmenin en kalıcı yoludur. Ancak unutmayın; izniniz olmayan sistemlerde güvenlik açığı aramak yasa dışıdır. Öğrendiklerinizi güvenle ve yasal bir çerçevede test edebilmeniz için özel olarak hazırlanmış şu platformları kullanabilirsiniz:
PortSwigger Web Security Academy: Burp Suite'in yaratıcıları tarafından hazırlanan bu platform, siber güvenlik eğitiminin altın standardıdır. Gerçek dünya senaryolarına dayanan onlarca farklı seviyede XSS laboratuvarını tamamen ücretsiz çözebilirsiniz.
Google XSS Game: Google mühendisleri tarafından hazırlanan bu site, XSS mantığını oyunlaştırarak öğretir. Yeni başlayanlar için harika bir başlangıç noktasıdır ve temelden başlayarak giderek zorlaşan 6 seviyeden oluşur.
OWASP Juice Shop: Modern web teknolojileriyle yazılmış, kasten zafiyetli bırakılmış bir e-ticaret sitesidir. Kendi bilgisayarınıza (Docker vb. üzerinden) kurarak kendi izole ortamınızda XSS dahil birçok açığı bulma pratiği yapabilirsiniz.
TryHackMe: Rehberli odaları (rooms) sayesinde adım adım XSS'in nasıl tespit edilip sömürüleceğini uygulamalı olarak gösterir. Özellikle siber güvenliğe yeni başlayanlar için açıklayıcı metinleri çok faydalıdır.
Kendinizi test ederken ezbere kod yapıştırmak yerine, kaynak kodları okuyun ve gönderdiğiniz kod parçacıklarının (payload) arka planda nasıl çalıştığını anlamaya odaklanın. Güvenli kodlamalar!
Harika bir fikir. Bu sayede okuyucular laboratuvarlara girdiklerinde ellerinde denemeye başlayabilecekleri somut bir cephane olur.
Bu bölümü "Pratik Yapma Zamanı" başlığının hemen altına veya yazının sonuna ekleyebilirsiniz:
İlk Testleriniz İçin Temel XSS Payload'ları (Test Kodları)
Laboratuvar ortamlarında (veya kendi kurduğunuz test sunucularında) bir girdinin zafiyet barındırıp barındırmadığını anlamak için genellikle sisteme zarar vermeyen, sadece zafiyetin varlığını ispatlayan (Proof of Concept) kod parçacıkları kullanılır.
Bir Red Team (Kırmızı Takım) bakış açısıyla zafiyet avına çıkarken test edebileceğiniz en temel payload örnekleri şunlardır:
1. Klasik Doğrulama (En Temel Seviye) Eğer web sitesi hiçbir filtreleme yapmıyorsa çalışacak en basit XSS kodudur. Ekranda "1" yazan bir uyarı kutusu çıkarır.
<script>alert(1)</script>
2. Etiket Filtrelerini Atlatma (Event Handlers)
Bazen sistemler <script> kelimesini kara listeye alıp engeller. Bu durumda HTML etiketlerinin özelliklerinden (örneğin bir resim yüklenemediğinde çalışacak hata kodu) faydalanılır.
<img src="olmayan-resim.jpg" onerror="alert('XSS Bulundu!')">
3. Bağlantı (Link) Tabanlı Enjeksiyon Özellikle kullanıcıdan profil web sitesi veya link istenen alanlarda test edilir. Kullanıcı linke tıkladığı anda JavaScript kodu tetiklenir.
<a href="javascript:alert(document.domain)">Tıklayınız</a>
4. Çerez (Cookie) Okuma Testi
Zafiyetin sadece ekrana yazı yazdırmaktan ibaret olmadığını, oturum bilgilerine ulaşılabildiğini kanıtlamak için kullanılır. (Eğer HttpOnly bayrağı yoksa kullanıcının aktif çerezlerini ekrana basar).
<script>alert(document.cookie)</script>
Önemli İpucu: Gerçek dünyadaki siber güvenlik senaryolarında sistemler genellikle bu kadar basit girdileri yakalar. Laboratuvarlarda ilerledikçe bu kodları bölmeyi, encode etmeyi (örneğin URL encoding) veya farklı HTML etiketlerinin içine gizlemeyi öğreneceksiniz.
Yorumlar