Yıllardır duyduğumuz, “XSS zafiyeti var” cümlesinin içinde geçen XSS zafiyetinin ne olduğunu, nasıl kullanıldığını biraz yakından inceleyelim.
Tanımını yapacak olursak Siteler Arası Betik Çalıştırma (Cross-Site Scripting) (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.
Cross-Site Scripting (XSS) OWASP Top 10 listesinde bulunmaktadır. Owasp’ta saldırıyı 2 şekilde meydana gelir:
- Veri web uygulamasına güvenli olmayan kaynaktan girerse, sıkça istek gönderilerse
- Veri, kötü niyetli içerik doğrulaması olmadan dinamik içerik içerisinde kullanıcıya gönderilmişse
Kısaca özetlemek gerekirse birincide kalıcı olmayan XSS’ten ikincide siteye gömülmüş kalıcı XSS’ten bahsediyor.
XSS saldırıları VBScript, ActiveX yapılabilir ama en çok HTML ve JavaScript kullanılıyor. Peki biz kullanıcılar XSS ile nasıl karşılaşabiliriz?
- XSS hedef kullanıcı tarafından çalıştırılan kötü amaçlı komut dosyası ile yapılabilir.
- Hedef tarafından görüntülenen sayfanın link ile tıklanacak ve kullanıcın kimlik bilgilerini isteyen sahte sayfa ya da form şeklinde bir sayfa ile olabilir.
- Hedef tarafından görüntülenen reklam içeren web sitelerinde.
- Kullanıcıya ya da topluluğa gönderilen kötü niyetli e-postalarla XSS saldırısına maruz kalabiliriz.
XSS Nasıl Yapılır?
Sitemizin “Nasıl yapılır?” kısmında çeşitleriyle birlikte uygulamasını paylaşacağım ama kısaca nasıl gerçekleştiğinden bahsetmek istiyorum. Örnek bir XSS saldırı kodu aşağıdadır. Bu kodda bir arama sayfasında html filtrelemesi yapılmazsa olabilecekler öngörülmüştür:
<script>alert(“test”)</script>”>
gibi bir değeri text alanına girdiğimizde HTML taglarının encode şekilde işlendiği için tarayacımızda gönderdiğimiz test mesajını görürüz.
Zafiyet sitenin hangi kısımlarında bulunur? Açık genellikle POST ve GET metodlarının kullanıldığı bölümlerde görülür fakat,açığın gerek anasayfada gerekse arka planda yazılımdan kaynaklanan hata nedeniyle bulunması kaçınılmazdır. Bunun anlamı kullanıcının siteden veri istediği ya da veri girişi yaptığı kısımlarda bulunur.
Burada zararlı kodlar kullanıldığında Cookie çalma,sayfanın içinde başka sayfaya yönlendirme.Sitemize zararlı kodlar gömerek istedikleri başka saldırılar gerçekleştirebilirler. Bu alanlara manuel olarak saldırı yapılabilir. GitHub üzerinden cheat sheet (hile sayfası) kullanılabilir ama bu kodları tek tek denemek çok uzun zaman alacaktır. Bunun yerine linux aracı olan BeEF (The Browser Exploitation Framework Project) ile XSS açıklıklarını sömürebilirsiniz.
XSS Türleri Nelerdir?
3 Çeşit XSS Türü vardır. Reflected XSS, Stored XSS, ve
- Reflected XSS: Kullanıcının girilmesi beklenen parametre yerine Javascript kodu girerek bunu ekrana yansıtması ile tespit edilebilen XSS çeşitidir.
- Stored/Persistent XSS: Adında anlaşılacağı üzere kalıcı XSS türüdür.Bu sefer girilen payloadlar anlık olarak yansımaz bir veritabanına yada başka bir yere kayıt edilir daha sonradan ziyaret edildiğinde çalışan XSS çeşitidir.
- Dom XSS: Dom (Document Object Model) XSS Dom lardan kaynaklanan XSS dir.Gemelde # işaretinden sonra payload denenmesi ve sayfa yenilendiğinde alert alındığında DOM XSS var denilen XSS açıklığıdır.
XSS Nasıl Önlenir?
Bu saldırıyı engellemek için aşağıdaki birkaç önlem alınabilir:
- Arama girdisi, uygun kodlama kontrolünü içerecek şekilde sterilize edilebilir.
- Web sunucusu geçersiz istekleri yönlendirecek şekilde ayarlanabilir.
- Web sunucusu eşzamanlı girişi tespit edebilir ve oturumları sonlandırabilir.
- Web sunucusu iki farklı IP adresinden eşzamanlı girişi tespit edebilir ve oturumları sonlandırabilir.
- Web sitesi daha önce kullanılan kredi kartı numarasının sadece birkaç hanesini gösterebilir.
- Web sitesi kullanıcıların kayıt bilgilerini değiştirmeden önce tekrar parolalarını girmelerini gerektirebilir.
- Web sitesi İçerik Güvenlik Politikası’nın pek çok farklı yönünü kullanabilir.
- Kullanıcılar, “tehlikesiz gözüken” ancak kötücül olan linklere tıklamamaları konusunda eğitilebilir.
- Çerez HttpOnly bayrağı ile işaretlenerek JavaScript’in çereze erişimi engellenebilir.
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.