Cross-site scripting yani XSS, meşru ve güvenilir bir web sitesindeki bir güvenlik açığından yararlanarak siber suç işlemenin popüler bir yoludur. Genellikle son kullanıcıların tarayıcılarını veri çalmak, hesaplara erişmek vb. için hedefleyen yaygın bir siber saldırıdır, ancak web sitenizi değiştirmek ve güvenliğini sağlamak için de kullanılabilir.
XSS Nedir?
Cross-site scripting veya XSS, genellikle web uygulamalarında bulunan bir tür güvenlik açığıdır. XSS, bilgisayar korsanlarının diğer kullanıcılar tarafından görüntülenen web sayfalarına istemci tarafı komut dosyaları eklemesine olanak tanır ve aynı kaynak ilkesi gibi erişim denetimi atlamak için kullanılabilir.
Siteler arası komut dosyası çalıştırma saldırıları için yaygın olarak kullanılan savunmasız web uygulamaları forumlar, mesaj panoları ve yorumlara izin veren web sayfalarıdır. Kullanıcı girişi temizlenmemişse, VBScript, ActiveX, Flash, JavaScript ve CSS’de de XSS saldırıları mümkündür.
XSS Saldırısı Nasıl Çalışır?
Tipik bir XSS saldırısının iki aşaması vardır:
- Bilgisayar korsanı, hedeflediği kişinin ziyaret ettiği bir web sayfasına kötü amaçlı kod enjekte etmenin bir yolunu bulur.
- Hedeflenen kişi web sayfasını ziyaret eder ve kötü amaçlı kod çalıştırılır.
Birinci adımın çalışması için savunmasız web sitesinin sayfalarına doğrudan temizlenmemiş kullanıcı girdisi eklemesi gerekir. Bilgisayar korsanı daha sonra web sayfasına hedeflenen kişinin tarayıcısı tarafından kaynak kod olarak kabul edilen kötü amaçlı bir kod ekler.
Sosyal mühendisliği kullanarak kullanıcıyı yükü kendisinin yürütmesi için çekmeye dayanan başka XSS saldırıları da vardır.
XSS Neden Tehlikelidir?
XSS güvenlik açıkları, SQL enjeksiyon güvenlik açıklarından daha az tehlikeli olarak algılansa da, XSS saldırılarının, özellikle de JavaScript’e dayanan depolanmış XSS saldırılarının sonuçları çok tehlikeli olabilir:
- JavaScript, bir web sayfasının erişebildiği tüm nesnelere erişebilir, buna, bilgisayar korsanlarının yeterince korunmadıkları takdirde bir oturum tanımlama bilgilerine erişmelerine izin verebilen, document.cookie içeren bir kullanıcının tanımlama bilgileri de dahildir. Bilgisayar korsanı bir kullanıcının oturumuna erişebilirse, kullanıcının kimliğine bürünebilir, kullanıcı adına eylemler gerçekleştirebilir ve hassas verilere erişim sağlayabilir.
- JavaScript, tarayıcının etki alanını okuyabilir ve üzerinde değişiklikler yaparak web sitesinin tahrif edilmesini ve hassas bilgilerin ifşa edilmesini sağlayabilir.
- JavaScript, HTTP istekleri göndermek için XMLHttpRequest nesnesini kullanabilir.
- Modern tarayıcılardaki JavaScript, kullanıcının coğrafi konumuna, web kamerasına, mikrofonuna ve hatta bilgisayarındaki dosyalara erişmek için kullanılabilen HTML5 API’lerini kullanabilir. Bu API’lerin çoğu katılım gerektirse de, bilgisayar korsanları hedefledikleri kişileri isteklerini onaylamaya zorlamak için sosyal mühendisliği kullanabilir.
XSS Türleri
Farklı XSS türleri vardır ve her birinin farklı bir etkisi vardır. Bunları tek tek ele alalım:
1. Depolanan XSS
Kalıcı XSS olarak da bilinen Stored XSS, kötü amaçlı komut dosyasının hedeflenen sunucuya kaydedildiği bir XSS türüdür. Komut dosyasını bir sunucuya kaydettikten sonra bilgisayar korsanının tek yapması gereken, kurbanların bu sunucudaki kötü amaçlı komut dosyasını içeren web sayfasını görüntülemesini beklemektir. Bir kurban bu sayfayı görüntülediğinde, kötü amaçlı komut dosyası tarayıcılarında yürütülür.
Saklanan XSS, tek bir yük ile birçok kurbana saldırılabileceğinden tehlikeli bir XSS türüdür. Kurbanların normalde güvenilen bir web sitesine erişmenin yanı sıra herhangi bir ekstra adım atması gerekmez.
2. Reflected XSS
Reflected XSS, kötü amaçlı yükün bir web sitesine yapılan isteğin bir parçası olması durumudur. Bu saldırının başarılı olması için kurbanın bir bağlantıya tıklaması gerekir. Bilgisayar korsanı, kurbanı e-posta veya başka bir mesaj türüyle bir bağlantıya tıklaması için kandırmaya çalışabilir.
3. DOM tabanlı XSS
JavaScript bir bilgisayar korsanından veri alıp bir havuza aktardığında DOM tabanlı bir XSS güvenlik açığı oluşur. Belge Nesne Modeli veya DOM, JavaScript’in bir web sayfasının HTML’si ile etkileşime girebildiği bir arayüzdür. Havuz, bir XSS saldırısı sırasında kötü amaçlı bir komut dosyası çalıştırabilen bir JavaScript işlevi veya DOM nesnesidir. DOM tabanlı XSS, genellikle kurbanı bir bağlantıya tıklaması için kandırarak elde edilen reflected XSS gibidir.
Bu tür saldırılar arasındaki fark, yansıyan XSS ile yükün yanıt sayfasına yerleştirilmesi ve DOM tabanlı XSS ile bunun, sayfada bulunan istemci tarafı kodunda gerçekleşmesidir.
4. Self XSS
Self XSS saldırısı sırasında kurban, web tarayıcılarında kötü amaçlı kod çalıştırması için kandırılır. Bilgisayar korsanı kurbana kötü amaçlı kod gönderir ve kurbanın daha sonra bu kodu yürütmek için tarayıcıya yapıştırması gerekir. Bu tür XSS’nin başarılı olması için kurbanın bilgisayar korsanı tarafından sağlanan birden fazla adımı atması gerekir.
XSS Ne İçin Kullanılabilir?
Bilgisayar korsanları, aşağıda paylaşılan etkinlikleri gerçekleştirebilmek için siteler arası komut dosyası çalıştırma güvenlik açığından yararlanabilir:
Kullanıcının oturumunu ele geçirme: Çoğu çevrimiçi uygulama, kullanıcının birçok HTTP isteğinde tanımlanabilmesi için kullanıcı oturumlarını takip eder. Oturum tanımlama bilgileri, oturumları tanımlamak için kullanılır. Set-Cookie başlığı, bir uygulamada başarılı bir şekilde oturum açtığınızda, sunucu tarafından size bir oturum tanımlama bilgisi göndermek için kullanılır. Artık uygulamada bir sayfa görüntülediğinizde veya bir form gönderdiğinizde, çerez (artık tarayıcıda tutuluyor) sunucuya yapılan tüm isteklere dahil edilir. Bu şekilde sunucu sizi tanır. Bilgisayar korsanları, gerçek kullanıcının kimliğine bürünerek ve mevcut web oturumuna erişim sağlayarak bir kullanıcının oturumunu ele geçirmek için XSS kullanabilir.
Yetkisiz etkinlikler gerçekleştirme: HTTPOnly tanımlama bilgisi özelliği ayarlanmışsa, bir bilgisayar korsanı JavaScript kullanarak tanımlama bilgilerini çalamaz. Ancak bilgisayar korsanı yine de XSS saldırısı aracılığıyla kullanıcı adına program içinde illegal işlemler yapabilir.
Kullanıcı kimlik bilgilerini çalmak için kimlik avı: XSS, savunmasız web sitesine bir form enjekte etmek ve bu formu kullanarak kullanıcı kimlik bilgilerini toplamak için de kullanılabilir. Buna kimlik avı denir.
Bir tuş kaydedici enjekte ederek tuş vuruşlarını yakalamak: Bilgisayar korsanı, savunmasız web sayfasına bir JavaScript tuş kaydedici ekleyebilir ve mevcut sayfadaki kullanıcının tüm tuş vuruşlarını yakalayabilir. Bu tür bir saldırı XSS kullanılarak yapılabilir.
Hassas bilgileri çalmak: Kullanıcının mevcut oturumundan hassas bilgileri çalmak, bir XSS saldırısının gerçekleştirebileceği başka bir tehlikeli davranıştır. Bu yüzden bir çevrimiçi bankacılık uygulamasının XSS’ye karşı savunmasız olduğunu ve bilgisayar korsanının mevcut bakiyeye, işlem ayrıntılarına, kişisel verilere vb. erişimi olduğunu varsayabilirsiniz.
Cross-Site Scripting Zafiyeti Nasıl Giderilir?
XSS güvenlik açıklarını tespit etmek ve düzeltmek kolay değildir. Bununla birlikte, sağlam geliştirme uygulamalarını takip etmek ve güvenliğe öncelik vermek, sitenizi potansiyel olarak milyonlara mal olan yıkıcı siber saldırılardan ve ihlallerden kurtarabilir.
Bir geliştirici olarak XSS saldırılarını önlemeye yönelik bazı ipuçları aşağıdaki şekildedir:
- Temel kural olarak kullanıcı girdisine güvenmeyin. HTML ile oluşturulan herhangi bir kullanıcı girişi, bir XSS saldırısı riski taşır.
- Giriş alanlarına beslenen herhangi bir komut dosyasından kaçmak için uygun kaçış veya kodlama tekniklerini uygulayın.
- Enjekte edilen komut dosyalarını çıkarmak için kullanıcı girişini sterilize edin.
- İstemci tarafı komut dosyası oluşturma yoluyla erişilemez hale getirmek için tanımlama bilgileri için HttpOnly bayrağını ayarlayın.
- Kimliği doğrulanmamış kaynaklardan web sayfasına komut dosyası eklenmesini engellemek için Content Security Policy (CSP) uygulayın.
XSS ve CSRF Arasındaki Fark Nedir?
Siteler arası komut dosyası çalıştırma (XSS olarak da bilinir), bir bilgisayar korsanının kurbanın tarayıcısında rastgele JavaScript çalıştırmasına olanak tanır.
Bilgisayar korsanı, savunmasız bir kullanıcının yapmak istemediği bir şeyi yapmasını sağlamak için cross-site request forgery (veya CSRF) kullanabilir.
CSRF genellikle bir kullanıcının tamamlayabileceği eylemlerin yalnızca bir bölümünü etkiler. Birçok uygulama genel olarak CSRF korumaları uygular, ancak bir veya iki eylem savunmasız kalır. Başarılı bir XSS saldırısı ise, genellikle bir kullanıcıyı, güvenlik açığının bulunduğu özellikten bağımsız olarak, kullanıcının yapabileceği herhangi bir eylemi gerçekleştirmeye ikna edebilir.
CSRF normalde bir kullanıcının eylemlerinin yalnızca küçük bir yüzdesini etkiler. Pek çok uygulamada CSRF korumaları mevcuttur, ancak bir veya iki işlem hala hassastır. Buna karşılık, başarılı bir XSS saldırısı, bir kullanıcıyı, güvenlik açığının oluştuğu özellikten bağımsız olarak kullanıcının yapabileceği herhangi bir eylemi gerçekleştirmeye ikna edebilir.
XSS ve SQL Enjeksiyonu Arasındaki Fark Nedir?
SQL Injection, bilgisayar korsanları tarafından kullanılan ve bir bilgisayar korsanının bir web sayfası girişi aracılığıyla SQL sorgularına kötü amaçlı kod eklediği başka bir tekniktir. Bu enjeksiyon, bilgisayar korsanının kullanıcının sistemini kesmesine ve genel olarak bilgisayar korsanlarının başka türlü elde edemeyecekleri verilere erişmesine izin verir. Bilgisayar korsanları, kullanıcının sahip olmadığı bilgilere erişebilir ve bu programları değiştirerek sonunda programın içeriğini değiştirebilir. Bilgisayar korsanları, bu tür bilgisayar korsanlığını çeşitli yöntemlerle gerçekleştirebilir ve bunların tümü kullanıcı bilgilerine erişim sağlamada oldukça başarılı olabilir.
XSS ve SQL enjeksiyon yöntemlerinin ikisi de bilgisayar korsanları arasında yaygındır, fakat ikisi arasında bazı farklar vardır:
- SQL enjeksiyon saldırısı ile XSS enjeksiyon saldırısı arasındaki temel fark, SQL enjeksiyon saldırılarının veri tabanlarından veri almak için kullanılması, XSS saldırılarının ise kullanıcıları bilgisayar korsanının onlardan veri çalabileceği web sitelerine göndermek için kullanılmasıdır.
- SQL enjeksiyonu, veri tabanlarını hedeflemek için tasarlanmıştır, XSS ise son kullanıcılara saldırmak için tasarlanmıştır.
- Siteler arası komut dosyası oluşturma JavaScript’te daha popüler kullanılırken, SQL Enjeksiyon Yapılandırılmış Sorgu Dili’ni kapsar.
- SQL enjeksiyonu, programın veri tabanını hedefleyen sunucu tarafı bir güvenlik açığı iken XSS, diğer uygulama kullanıcılarını hedefleyen istemci tarafı bir güvenlik açığıdır.
- XSS genellikle JavaScript ile yazılırken, SQL enjeksiyonu Structured Query Language (SQL) kullanır. Bu, XSS ve SQL enjeksiyonu arasındaki başka bir farktır.