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ış:

  1. Kullanıcı veri girer

  2. Sunucu girdiyi işler

  3. Veri HTML içinde geri gösterilir

  4. 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.

HTML
<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.

HTML
<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.

HTML
<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).

HTML
<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

Bu blogdaki popüler yayınlar

Android Telefon/Tablet Ekranını Pardus ETAP 23 Yüklü Akıllı Tahtaya Yansıtma

Pardus Etap 23’de Unutulmuş Etap Yetkili Parolasını Sıfırlama

Pardus Etap 23 Yazıcı Kurulumu