Derinlemesine XSS Saldırı Tekniklerine Giriş

Dinamik web sitelerinde sunucu ve kod taraflı yanlış konfigürasyonlar yapılması, ortaya farklı türde zafiyetler çıkarabilir. Saldırganlar, bu zafiyetleri kullanarak hedef sistem üzerinde kod çalıştırma, verileri ifşa etme vb. saldırılarda bulunabilirler. Bu güvenlik zafiyetlerinden biri XSS (Cross Site Scripting) zafiyetidir. XSS zafiyetinden yararlanan bir saldırgan; bir web sitesi üzerinde oturum açabilen kullanıcıların kimlik bilgilerini çalma, kimliği doğrulanmış kullanıcıların cookie bilgilerini ele geçirme, web sitesinin çalıştığı sunucu üzerinde komut çalıştırma gibi işlemler yapabilir. Bu yazıda XSS zafiyetlerinin temeli olan JavaScript dilinin temelleri ve bir web sitesinde XSS zafiyeti keşfeden saldırganın bu zafiyetten yararlanarak neler yapabileceği anlatılmaktadır.

JAVASCRIPT

JavaScript, yaygın olarak web tarayıcılarında kullanılan yüksek seviyeli bir programlama dilidir. JavaScript popüler programlama dillerinden biridir. JavaScript bir web sitesi üzerinde birçok aksiyonun oluşmasını sağlar. Dinamik web sitelerinde HTML-CSS gibi programlama dilleri web sitelerin genel görünümünü düzenlemek için kullanılmaktadır. JavaScript ise web sitelerine; uyarı kutuları, rollover efekleri, açılır menüler gibi güçlü özellikler eklenmesi için kullanılır.

JavaScript, en çok kullanılan programlama dillerinden biri olarak kabul edilir. JavaScript dilinin neden öğrenilmesi gerektiğine dair maddeler aşağıda yer almaktadır:

  • Öğrenmesi kolaydır.
  • Etkileşimli bir web sitesinin oluşturulmasına yardımcı olur.
  • Tarayıcı tarafından yorumlanabilen tek programlama dilidir.
  • Sunucu tarafında değil, tarayıcı tarafında çalışmakta ve görüntülenebilmektedir.

HTML uyumludur ve HTML kodlarıyla beraber çalışabilmektedir.

Javascript Event Handlers

JavaScript, HTML içerisine gömülebilir ve çalıştırılabilir. Ayrıca JavaScript dili ile HTML nesneleri yönetilebilir. Bu işlemler için JavaScript programlama dilinde olay işleyicileri (event handlers) bulunur. Örneğin, bir kullanıcı bir web sayfasında bulunan bir butona tıkladığında, bir pop-up açılması için olay işleyicileri kullanılabilir. Sayfa üzerinde; bir butona tıklama, tuşa basma, pencereyi kapatma, pencereyi yeniden boyutlandırma vb. gibi işlemler yapmak birer olaydır. Bu olaylar ise JavaScript olay işleyicileri ile yönetilebilir. Aşağıda JavaScript dilinde bulunan bazı olay işleyicileri açıklanmaktadır.

Onload

Onload, bir web sayfası tam olarak yüklendikten sonra, bir fonksiyonu çalıştırmak amacıyla uygulanan bir olaydır. Onload olayı genel olarak geliştiriciler tarafından karşılama mesajı gibi kullanıcı dostu özellikleri göstermek amacıyla kullanılır. Bu olay, genel olarak <body> etiketi ile ilişkilendirilir.

Ayrıca JavaScript onload olayı, sayfayı ziyaret eden kullanıcıların tarayıcılarını otomatik olarak kontrol etmek ve web sitelerinin yükleneceği yolu belirlemek amacıyla sıklıkla kullanılır. Resim 2.1.1’de onload fonksiyonunun kullanıldığı bir örnek yer almaktadır.

Resim 2.1.1 – Onload Fonksiyonu

Bu örnekte web sitesine giriş yapan kullanıcıları “Onload Example” şeklinde bir uyarı karşılaşılmaktadır.

Onmouseover

Onmouseover, bir kullanıcı mouse imlecini web sayfasının belirli bir alanına getirdiğinde, belirtilen JavaScript kodunun çalışmasını sağlar. Resim 2.1.2’de onmouseover ile ilgili bir örnek yer almaktadır.

Resim 2.1.2 – Onmouseover Fonksiyonu

Bu örnekte yer alan kod ile, kullanıcı mouse imclecini <h1> etiketinin üzerine getirildiğinde yazının rengi mavi, mouse ‘un imleci başka bir alana götürüldüğünde ise yazının rengi yeşil olmaktadır. Bu durum “Onmouseover” bize sağladığı özelliklerden biridir.

CROSS-SITE SCRIPTING (XSS)

XSS (Cross Site Scripting), saldırganların HTML ve JavaScript gibi istemci tabanlı script dillerinden yararlanarak web sayfalarına istemci taraflı kod enjekte etmelerine olanak veren bir güvenlik zafiyetidir. XSS saldırıları istemci taraflı gerçekleştirildiği için saldırılardaki asıl hedef web uygulamaları değil, kullanıcılardır. XSS güvenlik zafiyetinden yararlanabilen saldırganlar; ad-jacking, click-jacking, keylogging, session-hijacking vb. gibi ataklar gerçekleştirebilirler. Resim 3.1’de aşağıdaki kod parçasının XSS zafiyeti bulunan web sitesine enjekte edilmesi sonucunda bir uyarı penceresinin açıldığı örnek yer almaktadır:

<script>alert(“PRIVIAHUB”)</script>

Resim 3.1-XSS

XSS zafiyetleri; zararlı Javascript kodlarının sunucu tarafına yerleştirilmesi, web sitelerinin kullanıcı tarayıcılarında Javascript kodu çalıştırılmasına olanak verecek şekilde zafiyetler barındırması nedeniyle son kullanıcıların internet tarayıcılarında zararlı Javascript kodlarının çalıştırılması, kullanıcların cookie bilgilerinin çalınması ya da son kullanıcıların zararlı sitelere veya linklere yönlendirilmesi ile tetiklenebilen zafiyetlerdir. Resim 3.2’ de XSS zafiyetinin tetiklenmesine yönelik bir görsel yer almaktadır.

Resim 3.2 – XSS Zafiyetinin Tetiklenmesi

XSS Zafiyetinin Etkileri

XSS zafiyeti; 2013 OWASP Top 10 listesine göre “A3”, 2017 OWASP Top 10 listesine göre “A7” olarak sınıflandırılmıştır.  Bu güvenlik zafiyeti ile saldırganlar aşağıdaki işlemleri yapabilir:

  • Kullanıcı bilgilerinin elde edilmesi
  • Kullanıcıların farklı bir sayfaya yönlendirilmesi
  • Kullanıcılara ait bilgilerin ele geçirilmesi
  • Web uygulamasının yapısının değiştirilmesi

XSS Türleri

Bir önceki başlıklarda JavaScript ve XSS kavramlarından bahsedildi. Bu bölümde ise XSS türlerinden bahsedilecektir. XSS türleri aşağıdaki gibidir.

  • Stored XSS
  • Reflected XSS
  • DOM-based XSS
  • Blind XSS

Stored XSS

Stored XSS, bir web uygulamasına yapılan zararlı istek sonucunda, zararlı JavaScript kodunun veritabanına kaydedilmesi ve web sitesine yapılan tüm erişimlerde kodun sayfada çalışması ile tetiklenen bir XSS türüdür. Bu nedenden dolayı Stored XSS zafiyetinin etkileri diğer kullanıcılar tarafından da görülür. Stored XSS zafiyeti ile genel olarak yorum sayfalarında karşılaşılır. Resim 3.2.1.1’de kullanıcıların yorum yaptıkları ve kullanıcı girdilerinin kontrol edilmeden veritabanına kaydedilerek sayfaya yansıtıldığı bir web sayfası yer almaktadır.

Resim 3.2.1.1 – Zafiyetli Web Sayfası

Yorum alanına <script>alert(“PRIVIAHUB”)</script>  kodu girilerek yapılan istek sonucunda bu kod web sayfasına yansıtılmak üzere veritabanına kaydedildi. Sayfa yeniden açıldığında, içerisinde “PRIVIAHUB” yazan bir uyarı penceresiyle karşılaşıldı. Resim 3.2.1.2’de ekrana yansıyan uyarı penceresi ve veritabanı kayıtlarının listelendiği tablonun son hali yer almaktadır.

Resim 3.2.1.2 – Stored XSS Zafiyetinin Tetiklenmesi

Sayfaya farklı bir kullanıcının farklı bir cihaz üzerinden erişim sağlaması durumunda, JavaScript kodu çalışacak ve uyarı penceresi ekrana yansıyacaktır.

Reflected XSS

Reflected XSS, bir web sayfası üzerinde XSS zafiyetinin anlık olarak tetiklendiği ve sayfanın yenilenmesi sonucunda yapılan saldırının etkisinin ortadan kalktığı bir XSS türüdür. Bu zafiyetten yararlanan bir saldırgan kullanıcılardan anlık bilgiler almak amacıyla Phising vb. saldırılar düzenleyebilir. Resim 3.2.2.1’de Reflected XSS zafiyeti bulunan bir arama sayfası yer almaktadır.

Resim 3.2.2.1 – Zafiyetli Sayfa

Arama kutusuna girilen bir metin ile yapılan istek sonucunda, aranan metin ile ilgili sonuçlarla birlikte, aranan metin kontrolden geçmeden sayfaya yansımaktadır. Arama kutusuna bir JavaScript kodu yazılması durumunda XSS zafiyeti anlık olarak tetiklenecektir. Aşağıdaki kod XSS zafiyetinin tetiklenmesinde kullanılabilir.

<script>alert(“Priviahub”)</script>

Yapılan istek sonucunda Reflected XSS zafiyetinden yararlanılarak sayfa üzerinde JavaScript kodu çalıştırıldı.

Resim 3.2.2.2 – Reflected XSS

Dom Based XSS

DOM tabanlı XSS, HTML kodlarından değil DOM (Document Object Model)’dan meydana gelen bir XSS zafiyet türüdür.  Stored ve Reflected XSS saldırılarında, saldırı sonrası gelen sayfada XSS atağının sonuçlarını görmek mümkünken; DOM tabanlı XSS saldırılarında HTML kaynağı ve dönen yanıt, tamamen aynı olacaktır. DOM (Document Object Model) web sayfası üzerinde birçok farklı bölümleri tanımlamaktadır. Aşağıdaki tabloda DOM elementleri yer almaktadır.

Resim 3.2.3.1 –  DOM Elementleri

DOM tabanlı XSS zafiyeti genel olarak kullanıcı tarafından ulaşılabilir durumdadır. Günümüz web sitelerinde en yaygın olarak görülen XSS türlerinden biridir. Resim 3.2.3.2 ‘de DOM tabanlı XSS zafiyetinin bulunduğu sayfanın kodları yer almaktadır.


Resim 3.2.3.2 – DOM XSS Kaynak Kod

DOM tabanlı XSS zafiyetinin daha iyi anlaşılması adına Resim 3.2.3.1’de verilen örnekte sayfanın URL kısmına aşağıdaki gibi bir payload atanabilir.

PRIVIAHUB<script>alert(‘PRIVIAHUB’)</script>

Resim 3.2.3.3 – DOM XSS