Cross-Site Scripting (XSS) Nedir ve Nasıl Çalışır?
Cross-Site Scripting (XSS) bir web sitesinde kullanıcıdan alınan inputun doğrudan tekrar ekrana basılmasıyla tarayıcı tarafında HTML motorunun yorumlamasıyla beraber oluşur. Filtre ve encoding olmadığı için saldırgan bu alanda istediği gibi JavaScript ve HTML kodlarını hedefe sızmak için çalıştırabilmektedir.
XSS Saldırı Türleri Nelerdir?
3 adet XSS saldırısı türü vardır:
- Reflected XSS: Direkt HTTP isteğinden gelir.
- Stored XSS: Veritabanından gelir kalıcı olarak da anılır.
- DOM-based XSS: Nesnelerin yetersiz kontrolü sonucunda HTML nesneleri içerisinde doğan XSS türüdür.
Reflected Cross-Site Scripting Nedir?
Bir uygulama HTTP isteğinde bir veri aldığında ve bu verileri güvenli olmayan bir şekilde anında yanıt içine dahil ettiğinde ortaya çıkar.
http://domain/path/endpoint.php?variable=DATA
Şeklinde bir bağlantı örneğinde; endpoint.php içerisinde var olan “variable” bir veri almakta, alınan bu veri (DATA) direkt olarak içerik içerisine dahil edilirse burada Reflected XSS zafiyeti oluşacaktır.
<script>alert(document.cookie)</script>
Şeklinde gönderilen bir JS kodu uzak sunucudan döndükten sonra tarayıcının HTML motoru tarafından yorumlanır ve çerez (cookie) değerimiz ekrana yazdırılır.
Stored XSS Nedir?
Web uygulama güvenliğini ciddi şekilde tehdit eden bu XSS türü kalıcı bir XSS türüdür, girdide alınan parametreler veritabanına yazılır. Diğer adıyla “Persistence (Kalıcı) XSS” olarak tanımlanır. Veritabanına yazıldığından dolayı herhangi bir JavaScript ve html koduyla manipülasyonu sonrası tekrardan ve sürekli olarak veritabanından çağıran her kullanıcı etkilenir.
Yukarıdaki örnekte de olduğu gibi, veritabanına işlenen inputlarda herhangi bir kontrol olmadığında yazılan zararlı kodlar veritabanından olduğu şekilde çağrılacağından dolayı, tarayıcı motoru tarafından yorumlanıp çalıştırılacaktır.
Yukarıdaki resimde yazılan JS kodu yorumlandıktan sonra ekranda “xss” şeklinde bir alarm alınmaktadır.
DOM-based XSS Nedir?
Document Object Model, “DOM”, “Belge Nesnesi Modeli” anlamlarına da gelmektedir. HTML dökümanında JavaScript ile eriştiğimiz nesnelerde doğan XSS zafiyetidir. Girdilerini genel “#” işaretinden sonra alır. Bundan dolayıdır ki sunucuya gönderilmezler ve işlenen veri browser tarafında kalır. JavaScript ile input (girdi) işlendikten sonra nesne buna göre hareket eder. Bu noktada güvensiz şekilde tasarlanan veya yetersiz encoding işlemleri sonucunda DOM XSS doğar.
XSS Zafiyetine Karşı Çözüm Önerileri
Kullanıcıdan alınan bütün girdiler güvensiz olarak kabul edilmelidir. Bu minvalde;
- Girdinin doğruluğu,
- Girdinin Sterilize olması,
- Girdinin encoding işleminden geçmiş olması gerekmektedir.
Yapılan her encoding işlemi içeriğe e uygun şekilde yapılmalıdır.
Sızma testi çalışmalarında kritik veya yüksek seviyelerde bulguların oluşmasına neden olan XSS zafiyeti hızlı aksiyon alınması gereken ve sistem güvenliğini ciddi oranda azaltan bir zafiyettir.