TR | [PentesterLab] Web For Pentester (XSS)
PentesterLab – Web for Pentester’ı https://pentesterlab.com/exercises/web_for_pentester bağlantısını kullanarak indirebilir ve sanal bir bilgisayar olarak kurabilirsiniz.
XSS (Cross Site Scripting)
HTML kodları arasında istemci tabanlı kod eklenmesi yoluyla kullanıcının tarayıcısında istenilen kodun çalıştırılabilmesi olarak tanımlanıyor. XSS zafiyeti genellikle Javascript betik dili kullanılarak exploit edilir çünkü en temel HTML sayfalar içinde bile en rahat çalıştırılabilecek betik dil Javascriptdir, tarayıcılar xss saldırısında kullanılan kodların sistemde bulunan bir script olup olmadığını bilemez.
XSS zafiyetlerinde saldırı senaryoları değişir ancak genel amaç sistemde yetki sahibi yada hedef kullanıcının hesap bilgilerini ele geçirmektir.
XSS zafiyetleri genellikle URL üzerindeki string yada integer değer taşıyan değişkenlerin bulunduğu bağlantılarda ve arama, login, iletişim için kullanılan formlarda tespit edilir.
XSS zafiyeti kendi içerisinde 3 e ayrılmaktadır.
1 – Reflected XSS
Bu tür xss zafiyetlerinde kodlar kalıcı olarak çalıştırılmaz, bu tür zafiyeti sömürmek için hedef üzerinde zararlı bağlantının çalıştırılması gerekir. Zafiyetin sömürüleceği javascript kodlarının bulunduğu bağlantı hedefe gönderilir ve hedefin bağlantıyı açması beklenir.
2- Stored XSS
Bu tür xss zafiyetlerinde sisteme zararlı javascript kodları eklenilmesi mümkündür, bir ziyaretçi defteri formunda bu zafiyetin bulunması durumunda ziyaretçi defterine eklenen yorumlar veritabanına kayıt edilmektedir ve ziyaretçi defteri her görüntülendiğinde bu bilgiler veritabanından çekilerek gösterilmektedir, bu durumda veritabanına eklenen zararlı javascript kodları da ziyaretçi defteri her görüntülenmek istendiğinde çalıştırılacaktır.
3- DOM XSS
DOM; HTML taglarının genel adıdır. Bu tür XSS zafiyetinde javascript ile HTML taglarının özellikleri, değerleri vs. değiştirilebilmektedir. Reflected XSS türünde olduğu gibi sadece bağlantıyı açan istemciler saldırıdan etkilenir.
XSS | Example 1
İlk örnekte URL’de ki name parametresnin aldığı değerin ekrana bastırıldığını görüyoruz, h4yuc3 olarak değiştirelim.
Şimdi bu parametre üzerinden javascript kodlarını çalıştıralım.
Hiç bir filtreleme yapılmadan doğrudan javascript kodlarının çalıştırıldığını görüyoruz.
Payload : <script>alert(‘CanYouPwnMe’)</script>
XSS | Example 2
2. örnekte de name parametresnin aldığı değer ekrana yazdırılıyor.
yine aynı payloadı kullanmak istediğimizde bu kez <script> </script> taglarının silindiğini ve geriye kalan değerin ekrana bastırıldığını görüyoruz… Belli ki bir filtre uygulanmış ve <script> ve </script> filtreye eklenmiş ancak büyük, küçük harf duyarlılığı düşünülmüş mü kontrol edelim.
Tam tahmin ettiğimiz gibi büyük harfler filtreye eklenmemiş.
Payload : <SCRIPT>alert(‘CanYouPwnMe’)</SCRIPT>
XSS | Example 3
3. öernekte sistem yine aynı şekilde name parametresinin değerini ekrana basıyor.
yine büyük harfler ile script tagları eklediğimizde bu kez büyük harflerinde filtreye eklendiğini görüyoruz. Ancak sistem şuan gördüğü ilk <script>, <SCRIPT>, </script>, </SCRIPT> taglarını kaldırıyor, yukarıdaki <SCRIPT> ve </SCRIPT> taglarının arasına birer tane daha <script> ve </script> eklersek sistem ilk gördüklerini kaldıracak birer tane daha kalacaktır.
Payload : <SC<script>RIPT>alert(‘CanYouPwnMe’)</SC</script>RIPT>
XSS | Example 4
4. örnekte yine name parametresinin değeri ekrana bastırılıyor ancak değerin herhangi bir yerinde script kelimesi geçerse ekrana bastırılması gereken değer değil “error” mesajı bastırılıyor.
anlaşılan script tagını kullanamayacağız, farklı bir html tagı arasında javascript çalıştırmamız gerekiyor. <img> Tagını kullanmayı deniyoruz.
<img src=”javascript:alert(‘CanYouPwnMe’)”></img>
yukarıdaki payloadı kullanmayı denediğimizde “javascript” kelimesinin de filtreye takıldığını fark ediyoruz, yine “error” mesajı alıyoruz. Aldığımız mesaj aslında bizim için ipucu niteliği taşıyor 🙂 javascriptin onerror olayını kullanarak alert almayı deneyeceğiz.
<img src=onerror=”alert(‘CanYouPwnMe’)”></img>
Yukarıda ki payloadı kullanmayı denediğimizde artık error mesajından kurtulduk ancak alert alamadık.
Hello yazısının yanında image oluştuğunu görebiliyorz ve bu görseli sürükleyip yeni bir sekmeye bıraktığımızda src parametresinde verdiğimiz değerin URL oluşturduğunu ve bu durumun işimizi bozduğunu görüyoruz verdiğimiz bağlantının başına bir dizin için slash ve boşluk koyuyoruz.
Burada alert kodunun tetiklenme sebebine değinecek olursak özetle, image kaynağında verdiğimiz dizinde bir resim bulunamaması HTML tarafından hata olarak algılanıyor ve bu durumda onerror olayı tetikleniyor.
Payload : <img src=/ onerror=”alert(‘CanYouPwnMe’)”></img>
XSS | Example 5
4. örnek yine aynı şekilde devam ediyor, name parametresinin değeri ekrana bastırılıyor.
Bu örnekte alert almak istediğimizde ekrana error mesajı bastırılıyor.
Bunun sebebinin ne olduğunu anlayabilmek için kullandığımız tagları, kelimeleri, işaretleri … teker teker kaldırarak inceliyoruz.
En son <script> <script> taglarının çalıştığını hataya sebep olan kelimenin “alert” olduğunu anlıyoruz, alert yerine prompt kullanacağız.
Payload : <script>prompt(‘CanYouPwnMe’)</script>
XSS | Example 6
6. örnekte de name parametresine değer giriyoruz ancak bu ekrana bastırılmıyor, Değeri değiştirdikten sonra neler olduğunu daha iyi anlayabilmek için FireBug aracı ile kaynağı inceliyoruz.
Mevcut bir script tagının olduğunu görüyoruz, bu script tagını kapatıp kendimizinkini açalım.
Payload : </script><script>alert(‘CanYouPwnMe’)</script>
XSS | Example 7
Bu örnekte değeri değiştirdikten sonra Firebug ile kaynağı incelediğimizde mevcut script taglarını görüyoruz ve girdiğimiz değer script içerisinde bir değişkene atanıyor.
ancak bir önceki örnekte ki gibi mevcut script tagını kapatıp kendi tagımızı açmak istediğimizde < > işaretleri encode ediliyor ve bu durumda kod içerisinde satır yapısının bozulmasına sebep oluyor, aşağıdaki ekran görüntüsünde noktalı virgüllerden bunu anlayabileceksiniz.
Bu durumda yapmamız gereken, mevcut tagı kapatmadan bu script tagları arasında javascript kodumuzu çalıştırmak olacak. İlk önce sistemin çalışma şeklini analiz edelim;
var $a = ‘ Gireceğimiz Değer ‘; yani biz iki tırnak arasında işlem yapıyoruz, bu durumda yapmamız gereken ilk şey, açılmış olan tırnağı kapatmak ve sonrasında satırı sonlandırmak ( ‘ ; ) daha sonra alert kodumuzu eklemek, satırı sonlandırmak ve girdiğimiz değerden sonra tırnağı kapatmak için otomatik gelecek olan tırnağın önüne bir tırnak açmak ( alert(‘CanYouPwnMe’);’ )
Başarılı şekilde alert aldık, yukarıda bahsettiklerimin daha net anlaşılması için bu haldeyken kaynağı inceleyelim.
Payload : ‘;alert(‘CanYouPwnMe’);’
XSS | Example 8
Bu örnekte durum biraz değişiyor, artık URL üzerinde bir parametreye değil HTML form üzerinde bir text alanına değer girişi yapacağız.
Basit bir şekilde alert almayı denediğimizde ise HTML taglarının encode şekilde işlendiğini ve HTML olarak çalıştırılmadığını görebiliyoruz.
Formun kaynağını incelediğimizde girdiğimiz değerin tekrar /xss/example8.php bağlantısına post edildiğini ve bu sayfada işlendiğini görebiliyoruz.
Bu durumda ilk deneyeceğimiz şey <form …. > tagının içerisinde script çalıştırmayı denemek olmalı, bunu yapabilmek için girdiğimiz değerde bu dizini sonlandırıp ( / ) action=”….” parametresini kapatıp ( “ ) son olarak form tagınıda kapattıktan ( > ) sonra script kodlarımızı eklemek.
Payload : /”><script>alert(‘CanYouPwnMe’)</script>
XSS | Example 9
Son XSS Örneğinde …/xss/example9.php#hacker şeklinde bir URL ve ekranda bir “hacker” çıktısı ile karşılaşıyoruz, belli ki # işaretinden sonra gelen değeri ekrana bastıran bir sistem var ancak değeri değiştirdiğimizde ekrana bastırılmadığını fark ediyoruz.
bunun sebebi ne olabilir diye düşünecek olursak tabii ki sistem dinamik şekilde çalışıyor yani DOM XSS zafiyeti ile karşı karşıyayız. Değeri değiştirdikten sonra sayfayı yenilediğimizde bunu rahatlıkla fark edebiliyoruz.
XSS payloadımızı # işaretinden sonrasına ekliyoruz ve alertı görebilmek için sayfayı bir kere yenilememiz yeterli oluyor.
Payload : <script>alert(‘CanYouPwnMe’)</script>
&
Refresh