Siteler arası betik çalıştırma

Siteler arası betik çalıştırma (İngilizce: Cross-Site Scripting, kısaca XSS), genellikle web uygulamalarında bulunan bir tür bilgisayar güvenlik açıklığıdır. XSS, diğer kullanıcılar tarafından görüntülenen web sayfalarına istemci taraflı kodun enjekte edilmesine imkan verir. Siteler arası betik çalıştırma açıklığı, saldırganlar tarafından aynı kök politikası gibi bazı erişim kontrollerini atlatmak için kullanılabilmektedir. Web sayfaları üzerinde gerçekleştirilen siteler arası betik çalıştırma saldırıları, 2007 itibarıyla Symantec'in raporladığı tüm güvenlik açıklıklarının yaklaşık olarak %84'ünü oluşturmaktadır. Zafiyet içeren sitenin işlediği verinin hassasiyetine ve site sahibi tarafından uygulanan güvenlik tedbirlerine bağlı olarak, etkisi ufak bir aksamadan önemli bir güvenlik riskine kadar değişebilmektedir.

Arka plan

Web güvenliği, aynı kök politikası gibi güven unsurunun temelinde yatan mekanizmalar gibi pek çok mekanizmaya bağlıdır. Aynı kök politikası basitçe, eğer bir siteye (https://mybank.example1.com) ait içeriğe başka bir sistem üzerindeki kaynaklara erişim yetkisi verilmişse, bu siteye ait herhangi bir içeriğin de bu izinleri paylaşacağı ancak başka bir siteye (https://othersite.example2.com) ait içeriğin erişim için ayrıca izin alması gerektiğini ifade etmektedir.
Siteler arası betik çalıştırma saldırıları, web tabanlı uygulamalardaki, bunların sunucularındaki veya gereksinim duydukları pluginlerdeki bilinen açıklıkları kullanmaktadır. Bunlardan birisini istismar ederek, saldırganlar zafiyet içeren siteden gelen içeriğin içerisine kötücül içeriği eklemektedir. Oluşan birleştirilmiş içerik istemci tarafındaki web tarayıcısına eriştiğinde, tamamı güvenilir kaynaktan alınmış olduğu için sisteme verilen izinlerle çalışmaktadır. Web sayfalarına kötücül betikleri enjekte etmenin yolunu bularak, saldırgan hassas sayfa içeriğine, oturum çerezlerine ve kullanıcı adına tarayıcı tarafından yönetilen diğer pek çok bilgiye yükseltilmiş erişim yetkileri elde edebilir. Siteler arası betik çalıştırma saldırıları, bir kod enjeksiyonu çeşididir.
Microsoft siber güvenlik mühendisleri, "siteler arası betik çalıştırma" ifadesini Ocak 2000'de ortaya çıkarmıştır. "Siteler arası betik çalıştırma" ifadesi ilk olarak, hedeflenen alan adının güvenlik bağlamında saldırganın hazırladığı JavaScript kod parçasının çalıştırılabileceği bir şekilde, alakasız bir saldırgan sitesine ait veya ele geçirilmiş üçüncü parti bir web uygulamasının (yansıtılmış veya kalıcı olmayan bir XSS açıklığını kullanarak) yüklenmesini ifade ediyordu. Bu tanım daha sonra, bilgi güvenliği alanına yeni katılanlar için bir karışıklığa neden olacak şekilde, kalıcı ve JavaScript olamayan vektörleri (ActiveX, Java, VBScript, Flash veya HTML betikleri) de dahil edecek şekilde diğer kod enjeksiyonu türlerini de içerecek şekilde genişletilmiştir.
XSS açıklıkları, 1990'lardan beri raporlanmakta ve istismar edilmektedir. Geçmişte etkilenmiş önemli siteler arasında Twitter, Facebook, MySpace, YouTube ve Orkut gibi sosyal medya siteleri bulunmaktadır. Siteler arası betik çalıştırma açıklıkları bu yüzden ara bellek taşması açıklığını geçerek en yaygın şekilde raporlanan güvenlik açıklığı olmuştur. 2007 yılında bazı araştırmacılar, web sitelerinin %68'inin XSS saldırılarına karşı açık olduğunu belirtmiştir.

Çeşitleri

Siteler arası betik çalıştırma açıklıklarının standartlaştırılmış tek bir sınıflandırması bulunmamaktadır, ancak uzmanların çoğunluğu en azından 2 ayrı sınıfa ayırmaktadır: kalıcı olmayan ve kalıcı. Bazı kaynaklar, geleneksel (sunucu tarafındaki kod kusurlarından kaynaklanan) ve DOM-tabanlı (istemci tarafındaki kod içerisinde) olarak iki ayrı gruba daha ayırmaktadır.

Yansıtılmış (kalıcı olmayan)

Kalıcı olmayan (veya yansıtılmış) siteler arası betik çalıştırma açıklığı en temel web açıklığıdır. Bu açıklık, web istemcisi tarafından, en yaygın olarak HTTP sorgu parametreleri üzerinden (örn. HTML formlarından), sağlanan veri, kullanıcı için bir sonuç sayfası göstermek ve oluşturmak için sunucu taraflı betikler tarafından düzgün bir şekilde sterilize edilmeden hızlıca kullanıldığında ortaya çıkmaktadır.
HTML dokümanları kontrol ifadelerini, formatlamayı ve gerçek içeriği içeren düz ve seri bir yapıya sahip olduğu için, düzgün bir HTML kodlaması olmadan sayfada yer alan kullanıcının sağladığı geçerlenmemiş veri, markup enjeksiyonuna yol açabilmektedir. Potansiyel bir vektör örneği web sitesi arama motorudur: eğer birisi bir metin için arama yaparsa, arama metni, neyin aratıldığını belirtmek amacıyla hiçbir değişikliğe uğramadan sayfada tekrar gösterilmektedir. Eğer cevap paketi HTML kontrol karakterlerini filtrelemiyorsa veya reddetmiyorsa, bir siteler arası betik çalıştırma zafiyeti de beraberinde gelecektir.
Yansıtılmış bir saldırı, genelde e-posta veya bir web sayfası üzerinden yapılmaktadır. Yem, XSS vektörü içeren ve güvenilir bir siteye işaret eden, masum görünümlü bir URL'dir. Eğer güvenilir site XSS vektörüne karşı korumasızsa, linke tıklanması kurban tarayıcısının enjekte edilen betiği çalıştırmasına yol açmaktadır.

Kalıcı

Kalıcı (veya depolanmış) XSS açıklığı, siteler arası betik çalıştırma açıklığının en yıkıcı çeşididir. Saldırgan tarafından sağlanan veri sunucuda saklandığında ve sonrasında diğer kullanıcıların düzenli gezinimi sırasında "normal" sayfa üzerinde kalıcı olarak gösterildiğinde ortaya çıkmaktadır.  Tipik bir örneği, kullanıcıların diğer kullanıcıların okuması için HTML formatında mesajlar göndermesine izin veren çevrimiçi mesajlaşmadır.
Örnek olarak, üyelerin ilgilerini çekebilecek diğer üyeleri bulmak için diğer üyelerin profillerini tarayabildikleri bir randevu sitesini düşünelim. Gizlilik nedeniyle, site herkesin gerçek adını ve e-posta adreslerini gizli tutmaktadır. Bu veriler sunucuda gizli olarak tutulmaktadır. Bir üyenin gerçek adının ve e-posta adresinin tarayıcı üzerinde gözüktüğü tek zaman üye giriş yaptığında olmaktadır ve başka hiçbir kimsenin bilgilerini görememektedirler.
Bir saldırganın, Mallory'nin, siteye katıldığını ve sitede gördüğü insanların gerçek isimlerini öğrenmek istediğini varsayalım. Bunu yapabilmek için, diğer kullanıcıların tarayıcısında kendi profiline baktıklarında çalışacak bir betik yazar. Betik daha sonra bu bilgileri toplayan Mallory'e ait bir sunucuya mesaj gönderir.
Bunu yapabilmek için, "Sizin için ideal ilk randevuyu tanımlayınız" sorusuna Mallory (normal gözükecek) kısa bir cevap verir, ancak cevabının sonuna isimleri ve e-posta adreslerini çalmak için yazdığı betiği ekler. Eğer betik <script> etiketleri içerisine alınmışsa ekranda gözükmeyecektir. Sonrasında başka bir üye olan Bob'un Mallory'nin profiline baktığını varsayalım. Betik otomatik olarak tarayıcı tarafından çalıştırılacak ve Bob'un gerçek adı ve e-posta adresini doğrudan onun makinesi aracılığıyla çalacaktır.
Kalıcı XSS açıklıkları, saldırganın kötücül betiği bireysel olarak kurbanların hedeflenmesine veya üçüncü parti bir siteyi kullandırtmaya gerek olmadan otomatik olarak çalıştırıldığı için diğer türlere göre çok daha önemlidir. Özellikle sosyal ağ sitelerinde, kod istemci taraflı bir solucan türü oluşturarak hesaplar arasında kendisini yayacak şekilde tasarlanabilmektedir.
Enjeksiyon yöntemleri çok farklı olabilir; bazı durumlarda saldırgan böyle bir açıklığı istismar etmek için doğrudan web uygulaması ile etkileşime geçmeye ihtiyaç duymayabilmektedir. Saldırgan tarafından kontrol edilebilen ve web uygulaması tarafından alınan herhangi bir veri (e-posta, sistem logları, IM vb. üzerinden), enjeksiyon vektörü olabilmektedir.

Sunucu taraflı ve DOM-tabanlı açıklıkları

Tarihsel olarak XSS açıklıkları ilk olarak, tüm veriyi sunucu tarafında işleyen uygulamalarda bulunmaktaydı. Kullanıcı girdisi (XSS vektörleri dahil) sunucuya gönderilmekte ve sonrasında kullanıcıya web sayfası olarak geri gelmekteydi. Geliştirilmiş bir kullanıcı deneyimine olan ihtiyaç, AJAX kullanarak sunucudan ihtiyacı olduğunda veri çeken ve istemci tarafında çalışan bir sunum katmanı mantığına (JavaScript ile yazılabilir) sahip uygulamaların yaygınlaşmasına neden oldu.
JavaScript de kullanıcı girdisini işlediği ve web sayfası içeriğinde gösterdiği için, DOM-tabanlı siteler arası betik çalıştırma açıklığı olarak isimlendirilen yeni bir yansıtılmış XSS sınıfı oluştu. Bir DOM tabanlı XSS saldırısında, kötücül veri web sunucusuna ulaşmamaktadır. Bunun yerine, tamamen istemci tarafında olacak şekide JavaScript kodu tarafından yansıtılmaktadır.
Örnek bir DOM tabanlı XSS açıklığı, 2011 yılında pek çok JQuery eklentisinde bulunan açıklıktır. DOM tabanlı XSS saldırıları için önleme stratejileri, geleneksel XSS önleme yöntemlerine çok benzerdir ancak JavaScript kodu içerisinde uygulanmaktadır ve web sayfaları içerisinde bulunmaktadır (örn. girdi denetimi ve sterilizasyon). Bazı JavaScript çerçeveleri bu ve diğer türdeki saldırılara karşı dahili önlemlere sahiptir — örneğin Angular.js.

Self-XSS

Self-XSS, kurbanı kötücül JavaScript kodunu tarayıcısında çalıştırmaya ikna etmeye çalışan ve sosyal mühendisliğe dayanan bir XSS açıklık çeşididir. Sosyal mühendislik yöntemleriyle kullanıcının kod çalıştırmasını sağlamaya dayandığı için teknik olarak bir XSS açıklığı olmasa da, düzgün bir şekilde yapıldığında normal bir XSS açıklığıyla aynı risklere sahip olmaktadır.

İstismar Örnekleri

Siteler arası betik çalıştırma açıklıklarını istismar etmek isteyen saldırganlar, her bir açıklık sınıfına farklı şekillerde yaklaşmalıdır. Her bir sınıf için özel bir saldırı vektörü burada açıklanacaktır. Aşağıdaki isimler, bilgisayar güvenliğinde yaygın olarak kullanılan Alice-Bob isimlendirmesinden alınan teknik terimlerdir.
Tarayıcı İstismar Çerçeve Yazılımı (Browser Exploitation Framework) web sayfasına ve kullanıcının yerel ortamına saldırmak için kullanılabilmektedir.

Metin girdilerinin bağlamsal çıktı kodlaması/çevirimi

Bağlamsal çıktı kodlama/çevirimi, XSS saldırılarını durdurmak icing kullanılan birincil savunma mekanizmasıdır. Güvenilmeyen metinlerin HTML dokümanı içerisinde nereye konulacağına bağlı olarak kullanılabilecek HTML varlık çevirimi, JavaScript çevirimi, CSS çevirimi ve URL kodlaması gibi pek çok farklı çevirim yöntemi bulunmaktadır. Zengin veri formatını kullanması gerekmeyen pek çok web uygulaması, basit bir şekilde XSS saldırıları riskini büyük ölçüde ortadan kaldırmak için kodlamayı/çevirimi kullanabilir.
Yaygın olarak tavsiye edilse de, saddle beş XML özel karakteri üzerinde HTML varlık kodlamasının kullanılması pek çok XSS saldırısı vektörünün engellemesinde yetersiz kalmaktadır. Kodlama genelde zor olduğu için, güvenlik için geliştirilmiş kodlama kütüphanelerinin kullanımı genellikle daha kolay bir çözüm olmaktadır.

Güvenli bir şekilde HTML girdisinin geçerlenmesi

Web uygulamalarının pen çoğu (örn. formula ve webmail) kullanıcıların belirli bir HTML etiketi setini kullanmalarına izin vermektedir. Kullanıcıdan HTML girdisi (örn. <b>çok</b>) alınırken, çıktı kodlaması (örn. <b>very</b> büyük), kullanıcı girdisi tarayıcı tarafından HTML girdisi olarak yorumlanması gerektiğinden ("<b>çok</b> büyük" şeklinde göstermek yerine "çok büyük" şeklinde göstermesi) yeterli olmamaktadır. will not suffice since the user input needs to be rendered as HTML by the browser (so it shows as "very large", instead of "<b>very</b> large"). Kullanıcıdan HTML girdisi alınırken XSS saldırılarının durdurulabilmesi çok daha karmaşık bir durumdur. Güvenilmeyen HTML girdisi, herhangi bir XSS kodu içermediğinden emin olunabilmesi için bir HTML sterilizasyon motorundan geçmelidir.

Pek çok geçerleme yöntemi, aşağıdaki gibi bazı "riskli" html etiketlerinin kaldırılmasına (kara liste uygulama) dayanmaktadır:
Bu yaklaşım ile ilgili pek çok sorun bulunmaktadır. Örneğin, başarılı bir şekilde kullanıldığında XSS saldırısı ile sonuçlanabilecek bazı görünürde zararsız etiketlerin bırakılması.
(aşağıdaki örneğe bakınız) 
Diğer bir yaygın yöntem ise " ve ' işaretlerinin kullanıcı girdisinden çıkarılmasıdır. Ancak, bu da veri Gizleme (Obfuscation) ile gizlenebileceği için atlatılabilmektedir.

Çerez güvenliği

İçerik filtreleme dışında, siteler arası betik çalıştırma önlemleri için başka kesin çözüm getirmeyen yöntemler de yaygın olarak kullanılmaktadır. Bir örneği, çerez tabanlı kullanıcı kimlik doğrulaması yapılırken ilave güvenlik kontrollerinin uygulanmasıdır.  Çoğu web uygulaması bireysel HTTP istekleri arasında kimlik doğrulaması yapabilmek için oturum çerezlerini kullanmaktadır ve istemci taraflı betikler genelde bu çerezlere erişebildiği için basit XSS istismarları bu çerezleri çalabilmektedir. Bu tehditi ortadan kaldırmak için (genel olarak XSS problemini çözmese de), çoğu web uygulaması başta giriş yapan kullanıcının IP adresi ile oturum çerezlerini ilişkilendirmekte ve sonrasında o çerezi sadece belirlediği IP adresinin kullanmasına izin vermektedir. Çoğu senaryoda (eğer saldırgan sadece çerezin peşinde ise) bu başarılı olmaktadır, ancak saldırganın kurbanla aynı NATlanmış IP adresini veya vekil sunucuyu kullandığı durumlarda veya kurbanın mobil IP adresini değiştirdiği durumlarda geçerli olmamaktadır.
Internet Explorer (versiyon 6 ve sonrası), Firefox (versiyon 2.0.0.5 ve sonrası), Safari (web tarayıcı) (versiyon 4 ve sonrası), Opera (versiyon 9.5 ve sonrası) ve Google Chrome'da bulunan bir diğer önleyici mekanizma da, istemci taraflı betiklere karşı bir çerezi erişilemez kılan HttpOnly bayrağıdır. Faydalı olsa da, bu özellik ne çerezin çalınmasını ne de tarayıcı içerisindeki saldırıları engellemektedir.

Betikleri devre dışı bırakmak

Web 2.0 ve Ajax geliştiricileri JavaScript kullanımını gerekli kılsa da, bazı web uygulamaları herhangi bir istemci taraflı betiğin çalışmasına ihtiyaç duymadan çalışacak şekilde yazılmıştır. Bu durum kullanıcıların, eğer torch ederlerse, uygulamayı kullanmadan önce tarayıcılarında betik çalıştırılmasını devre dışı bırakmalarına izin vermektedir. Bu şekilde, kötücül olması olası istemci taraflı betikler bile sterilize edilmeden sayfa içerisine eklenebilir ve kullanıcılar XSS açıklıklarına karşı korumasız kalmaz.
Bazı tarayıcılar veya tarayıcı eklentileri, alan adı seviyesinde istemci taraflı betiklerin çalışmasını engelleyecek şekilde yapılandırılabilir. Bu yaklaşım tamamen geçerli bir yaklaşım değildir, çünkü betik çalıştırma varsayılan olarak aktifse, kullanıcı sitenin kötücül olduğunu anladıktan yani iş işten geçtikten sonra engellenebilmektedir.  Varsayılan olarak tüm betik çalıştırmayı engelleyen ve sonrasında kullanıcının alan adları için aktif hale getirilebilmesine izin veren yaklaşım çok daha etkilidir. Bu Internet Explorer (versiyon 4 ve üstü) üzerinde "Security Zones" ayarları ile ve Opera(versiyon 9 ve üstü) üzerinde "Site Specific Preferences" ayarları ile yapılabilmektedir. Firefox ve Gecko tabanlı tarayıcılar için bir çözüm de açık kaynak kodlu NoScript eklentisidir. Bu eklenti alan adı bazında betikleri aktif edebilmesine ek olarak betikler aktif edildiğinde de bir takım XSS koruma mekanizması uygulamaktadır.
Varsayılan olarak tüm sitelerde betikleri devre dışı bırakmakla ilgili en önemli sorun, işlevsellik ve cevap vermedeki önemli azalıştır (istemci taraflı betik çalıştırma, uzak bir sunucuya bağlantı kurma gereksinimi duymadığı için, sunucu taraflı betik çalıştırmaya göre hızlıdır). Betiklerin devre dışı bırakılmasıyla ilgili bir diğer sorun da, çoğu kullanıcının bunu anlamaması ve tarayıcılarını uygun bir şekilde nasıl güvenli yapacaklarını bilmemesidir. Bir diğer dezavantajı da, çoğu sitenin istemci taraflı betikler olmadan çalışmaması ve kullanıcıları bu özelliği devre dışı bırakmaya zorlaması ve sistemlerini açıklıklara açmasıdır. Firefox NoScript eklentisi, kullanıcının verilen bir sayfa üzerinde belirli betiklere izin vermesini aynı sayfadaki diğerlerini engellemesine izin vermektedir. Örneğin, example.com sitesine ait betiklere izin verilebilirken, aynı sayfa üzerinde çalışmayı deneyen reklamajansi.com sitesine ait betikler devre dışı bırakılabilir.

Gelişmekte olan savunma teknolojileri

Gelişmekte olan üç sınıf XSS savunması bulunmaktadır. Bunlar İçerik Güvenlik Politikası'nı, JavaScript mum havuzu araçlarını ve otomatik çevirim taslaklarını içermektedir. Bu mekanizmalar hala gelişmektedir, ancak XSS saldırılarının meydana geliş sıklığını büyük oranda düşürmeyi vadetmektedir.

Tarama hizmeti

Bazı şirketler, saldırının başarılı olup olmadığını test etmek için kendi sunucularından müşterininkine bir saldırı simüle ederek, periyodik bir tarama hizmeti sunmaktadır. Eğer saldırı başarılı olursa, müşteriye nasıl yapıldığına dair detaylı bilgi içeren bir rapor verilmekte ve müşteri başka birisi aynı saldırıyı yapmadan önce açıklığı kapatma şansı elde etmektedir.  Güncel bir testi geçen site üzerinde güvenilirlik işareti gösterilebilir. Tarama aracı tüm olası açıklıkları bulamayabilir, ve bu yüzden güvenilirlik işaretine sahip siteler hala yeni saldırı türlerine karşı açık olabilir. Ancak tarama bazı problemleri tespit edebilir. Müşteri bu sorunları çözdükten sonra, site bu hizmet alınmadan önceki haline göre daha güvenli olmaktadır. XSS açıklıklarına karşı tam bir koruma gerektiren siteler için, kaynak kod analizi gibi değerlendirme yöntemleri gerekmektedir. İlave olarak, eğer JavaScript sayfa üzerinde çalışıyorsa, güvenilirlik işareti, işaretin statik bir kopyası ile taklit edilebilir. (bu yüzden, teoride, bu tür bir hizmet XSS risklerini ortadan kaldırmak için yeterli olmayacaktır).

İlgili güvenlik açıklıkları

Bir Global Siteler Arası Betik Çalıştırma (UXSS Vera Global XSS) saldırısında, tarayıcı içerisindeki açıklıklar istismar edilmektedir (XSS saldırılarında olduğu gibi diğer web sitelerindeki açıklıklar yerine). Bu tür saldırılar yaygın olarak Anonymous tarafından bir ağın kontrolünü ele geçirmek için DDoS'a ile beraber yapılmaktadır.
Farklı açıklık kategorileri veya saldırı teknikleri XSS ile ilgilidir: cross-zone scripting saldırısı bazı tarayıcılardaki "zone" mantığını istismar etmekte ve genelde daha yüksek yetkilerle kod çalıştırmaktadır. HTTP Başlık Enjeksiyonu, HTTP protokolü seviyesindeki kodlama problemlerinden ötürü (HTTP yanıt bölme saldırısı gibi saldırıları mümkün kılmasına ek olarak) siteler arası betik çalıştırma şartlarının oluşturulmasında kullanılabilmektedir.
Siteler arası istek sahteciliği (CSRF/XSRF) neredeyse XSS'in zıddı sayılabilir. Çünkü, kullanıcının siteye olan güvenini istismar etmek yerine, saldırgan (ve onun kötücül sayfası), kimliği doğrulanmış kullanıcıların bilinçli eylemlerini temsil ettiğine inandığı istekleri yollayarak sitenin istemci yazılımına olan güvenini istismar etmektedir. XSS açıklıkları (aynı Alan adı üzerinde çalışan diğer uygulamalardakiler dahil) saldırganların CSRF tedbirlerini atlatabilmesine izin vermektedir.
Gizli yönlendirme, XSS Vera Açık Yönlendirme saldırılarına karşı korumasız olan üçüncü parti istemcilerden faydalanmaktadır. Normal oltalama girişimleri kolayca tespit edilebilir, çünkü kötücül sayfanın URL bilgisi genelde gerçek site isminden birkaç harf uzakta olacaktır. Gizli yönlendirmenin farkı, saldırganın kötücül bir giriş diyalog kutusu ile site içeriğini bozarak gerçek siteyi kullanmasıdır.
Son olarak, SQL Enjeksiyonu bir uygulamanın veri tabanı katmanındaki bir açıklığı istismar etmektedir. Kullanıcı girdisi yanlış bir şekilde filtrelendiğinde, herhangi bir SQL ifadesi uygulama tarafından çalıştırılabilmektedir.