Cross Site Scripting(XSS), Siteler Arası Komut Dosyası Çalıştırma saldırısıdır. Kötü niyetli komut dosyalarının, başka türlü iyi huylu ve güvenilir web sitelerine enjekte edildiği bir tür sızma saldırısıdır. Bu saldırı şeklindeki saldırgan, genellikle bir tarayıcı tarafı komut dosyası biçiminde kötü amaçlı bir kodu, farklı bir son kullanıcıya göndermek için bir web uygulaması kullanarak çalıştırır. Bu saldırıların başarılı olmasına izin veren kusurlar oldukça yaygındır ve bir web uygulamasının, kullanıcıların veri girişi yaptığı her yerde, girilen verinin doğrulamadan veya encode edilmeden post edilmeye çalışıldığı , sunucu tarafına gönderilmeye çalışıldığı yerlerde meydana gelir.
OWASP(Open
Web Application Security Project), yazılımın güvenliğini artırmak için çalışan,
kar amacı gütmeyen ve tüm dünyada kabul gören bir vakıftır. OWASP’ a göre üç
tür XSS bulunmaktadır. Önceleri, Stored
XSS ve Reflected XSS olmak üzere
iki ana XSS türü tanımlanmış, sonrasında, 2005
yılında Amit Klein tarafından DOM Based XSS tanımlanmıştır.
Stored XSS genellikle, kullanıcı girdisi
bir veritabanında, bir mesaj forumunda, ziyaretçi günlüğünde, yorum alanında
vb. gibi hedef sunucuda depolandığında oluşur. Ve daha sonra bir kurban,
depolanan verileri web uygulamasından o olmadan alabilir. HTML5 ve diğer tarayıcı
teknolojilerinin ortaya çıkmasıyla, saldırı yükünün mağdurun tarayıcısında
(örneğin bir HTML5 veritabanı gibi) kalıcı olarak saklandığını ve hiçbir zaman
sunucuya gönderilmediğini düşünebiliriz.
Reflected XSS, bir web uygulaması tarafından bir hata mesajı, arama sonucu veya isteğin bir parçası olarak kullanıcı tarafından sağlanan girdilerin bir kısmını veya tamamını içeren verilerin güvenli hale getirilmeden tarayıcıda işlenip, kullanıcı tarafından sağlanan verileri kalıcı olarak depolamaksızın başka bir yanıtta kullanıcı girdisi anında döndürüldüğünde ortaya çıkar. Bazı durumlarda, kullanıcı tarafından sağlanan veriler tarayıcıdan asla ayrılmayabilir.
DOM Based XSS,
ile ilgili ilk makaleyi(“DOM Based Cross Site Scripting or XSS of the Third
Kind” (WASC writeup), Amit Klein, July 2005) yayınlayan Amit Klein
tarafından tanımlandığı üzere, DOM Tabanlı XSS, kaynaktan havuza tüm bozuk veri
akışının tarayıcıda gerçekleştiği, yani verilerin kaynağı DOM'da ki havuz da,
DOM'dadır ve veri akışı tarayıcıdan asla ayrılmaz. Örneğin, kaynak (kötü
amaçlı verilerin okunduğu yer) sayfanın URL 'i (ör. Document.location.href)
veya HTML'nin bir öğesi olabilir ve kötü amaçlı verilerin yürütülmesine neden olan
hassas bir yöntem çağrısı olabilir (ör., document.write).
2012
yılına kadar XSS türleri bu şekilde üç tür olarak kabul görmüş. Ancak 2012 yılı
ortalarında araştırma topluluğu bu türlerin bir biri ile örtüşen tarafları
olduğunu ve Server XSS(Stored Server
XSS, Reflected Server XSS) ve Client XSS(Stored
Client XSS, Reflected Client XSS) olarak iki türde gruplayarak duyurmuş ve bu
türler kabul görmüştür.
Server XSS, kullanıcı tarafından sağlanan güvenilmeyen veriler sunucu tarafından oluşturulan bir HTTP yanıtına dahil edildiğinde oluşur. Bu verilerin kaynağı talepten veya saklanan bir konumdan olabilir. Bu nedenle, hem Reflected Server XSS'e hem de Stored Server XSS'e sahip olunabilir. Bu durumda, güvenlik açığının tamamı sunucu tarafındaki koddadır ve tarayıcı yalnızca yanıtı işliyor ve içine gömülü herhangi bir geçerli komut dosyasını çalıştırıyor demektir.
Client
XSS,
kullanıcı tarafından sağlanan güvenilir olmayan veriler DOM 'u güvenli olmayan
bir JavaScript çağrısıyla güncellemek için kullanıldığında oluşur. Bir
JavaScript çağrısı, DOM'a geçerli JavaScript eklemek için kullanılabiliyorsa,
güvenli değildir. Bu verinin bu kaynağı DOM'dan olabilir veya sunucu
tarafından gönderilmiş olabilir (bir AJAX çağrısı veya bir sayfa yükleme
yoluyla). Verilerin nihai kaynağı, bir request ten, Client da veya Server
da depolanan bir konumdan olabilir. Bu nedenle, hem Reflected Client XSS'e
hem de Stored Client XSS'e sahip olunabilir.
Bu yeni tanımlarla, DOM Tabanlı
XSS 'in tanımı değişmez. DOM Tabanlı XSS, basitçe Client XSS 'in bir alt
kümesidir; burada veri kaynağı Server dan ziyade DOM'da bir yerdedir.
Hem Server XSS hem de Client
XSS 'in depolanabileceği veya yansıtılabileceği göz önüne alındığında, bu yeni
terminoloji, Dave Wichers ’ın DOM Tabanlı XSS konuşmasında gösterildiği
gibi, bir eksende Client & Server XSS ve diğer eksende Stored and Reflected
XSS ile basit, temiz, 2 x 2 matris ile ifade edilmiştir;
Önerilen Server
XSS ten korunma yöntemleri;
Server XSS, bir HTML yanıtına
güvenilmeyen verilerin eklenmesinden kaynaklanır. Çoğu durumda Server XSS 'e
karşı en kolay ve en güçlü savunma şudur:
- Context-sensitive server side output encoding(Bağlama duyarlı
sunucu tarafı çıktı kodlaması)
Bağlama duyarlı sunucu tarafı
çıktı kodlamasının nasıl uygulanacağına ilişkin ayrıntılar, OWASP XSS (Siteler
Arası Komut Dosyası) Önleme Hile Sayfasında (https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) ayrıntılı
olarak sunulmuştur. Sunucu XSS'i önlemeye yardımcı olmak için girdi doğrulama
veya veri sterilizasyonu gerçekleştirilebilir, ancak doğrulama işlemi bağlama
duyarlı çıktı kodlamasından çok daha zordur.
Önerilen Client
XSS Savunmaları;
Client XSS, DOM'u güvenli
olmayan bir JavaScript çağrısıyla güncellemek için güvenilmeyen verilerin
kullanılması durumunda ortaya çıkar. Client XSS'ye karşı en kolay ve en
güçlü savunma şudur:
- Güvenli JavaScript API'leri kullanmak
Bununla birlikte,
geliştiriciler genellikle hangi JavaScript API'lerinin güvenli olup olmadığını
bilmezler, en sevdikleri JavaScript kitaplığındaki hangi yöntemlerin güvenli
olduğunu umursamazlar. Hangi JavaScript ve jQuery yöntemlerinin güvenli ve
güvensiz olduğuna dair bazı bilgiler, Dave Wichers'ın 2012 XSS 'de OWASP AppSec
ABD'de sunulan DOM Tabanlı XSS konuşmasında sunulmuştur(“Unraveling some of
the Mysteries around DOM Based XSS” (OWASP AppSec USA), Dave Wichers, 2012). Bir
JavaScript yönteminin güvenli olmadığını biliyorsanız, birincil öneri; kullanmak için alternatif bir güvenli yöntem bulmaktır. Herhangi bir
nedenle yapamazsanız, bu verileri güvenli olmayan JavaScript yöntemine
geçirmeden önce tarayıcıda bağlama duyarlı çıktı kodlaması
yapılabilir. OWASP 'ın bunun nasıl doğru bir şekilde yapılacağına dair
rehberliği ise ; DOM Based XSSÖnleme Hile Sayfasında(https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html)
sunulmuştur . Bu kılavuzun, verilerin gerçekte nereden
geldiğine bakılmaksızın (DOM veya Sunucu) tüm İstemci XSS türleri için geçerli
olduğunu unutmamak gerekir.
Bunların yanı sıra genel
perspektifte bakacak olursak, tüm web sunucularında HTTP TRACE desteğini kapatmak da fayda sağlayacaktır.
Kaynaklar:
· https://owasp.org/www-community/attacks/xss/#
· https://owasp.org/www-community/Types_of_Cross-Site_Scripting
· http://www.webappsec.org/projects/articles/071105.shtml
· https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html