Derinlemesine XSS Bypass Bölüm 3

Merhaba arkadaşlar, Derinlemesine XSS Bypass serimizin üçüncüsü ile devam ediyoruz. Konunun daha rahat anlaşılabilmesi için serinin ilk ikisini okumanızı tavsiye ediyorum. Lafı uzatmadan üçe giriş yapalım.

Bugün konumuz “Sanitization” yani Türkçe karşlığı sterilize etmek üzerine olacaktır. Güvenlik mekanizmaları genellikle tüm isteği engellemek yerine potansiyel XSS payloadlarını sterelize etmeyi uygun görür. Sızma testlerinde veya Bug Bounty camiasında karşımıza çıkan en yaygın filtreleme yöntemidir. Yani basitçe gönderdiğiniz payload’da anahtar kelimeyi/etiketi zararlı bulur ve sterelize ederek o kelimeyi çıkartır. Burada yapılabilecek hatalardan yaygın olanı ise anahtar kelimenin sadece ilk örneğinin kaldırılmasıdır. Örneğin:

Biz ” <script> alert (1) </script>” payloadı gönderdiğimizde “<script>” anahtar kelimesi/etiketi sterilize edilecek ve elimizde sadece alert(1) ifadesi kalacaktır. Aşağıdaki payload gönderildiğinde ise payloada bakılacak script etiketi geçen yerler kaldırılacaktır.

<scr<script>ipt>alert(1)</script>

Burada ilk script etiketi sterilize edilecek fakat ikinci kez edilmediğinden kaynaklı payloadımız çalışacaktır.

Ters slash işareti ( \ ) kullanılarakta bypass yapılabilir. Örneğin aşağıdaki kodu kontrol edebildiğimizi düşünelim.

<script>
	var key = ' Okan ';
</script>

Burada tırnak işaretlerinden kurtulabilmek için ters slash denenebilir. Yukarıdaki Okan yerine aşağıdaki payload gönderililirse tek tırnak bypass edilebilir.

Okan\' alert(1); //

Sonda gönderilen normal slash işaretleri ile payloaddan sonra gelicek tüm kodları yorum satırına düşürüyoruz. Javascript’te ” // ” karakteri yorum satırı eklemek için kullanılmaktadır.

Yararlı Javascript yöntemlerinden biri olan String.fromCharCode() kullanılabilir. Unicode değerler oluşturup kullanmamızı sağlamaktadır. Örneğin:

String.fromCharCode(120,115,9416)

Küçük x decimal karşlığı 120

Küçük s decimal karşılığı 115

Circled Decimal karşlığı yani yuvarlak içinde büyük S 9416

Ayrıca oluşturulan bir dizeden kaçmak için unescape yöntemiyle oynayabiliriz. Örneğin .source tekniği ile dizeden kaçabiliriz.

unescape(/%78%u0073%73/.source)

Bu özellik kullanımdan kaldırılmış olsa bile bir çok tarayıcı desteğini devam ettirmektedir. Denenebilir.

Buna ek olarak decodeURI ve decodeURIComponent yöntemleri vardır.

decodeURI(/alert(%22xss%22)/.source)

decodeURIComponent(/alert(%22xss%22)/.source)

Gönderdiğimiz payloadlara baktığımızda genelde çoğunda parantezler mevcut. Peki ya parantez işaretleri sterilize ediliyorsa o zaman ne yapacağız? Gareth Heyes diye bir abimiz parantez kullanmadan bir fonksiyona argüman iletmenin bir yolunu bulmuş. Onerror olay işleyicisini kullanarak bir şeyler yapabilmiş.

<img src=x onerror="window.onerror=eval;throw'=alert\x281\x29'"> 

eval = Hata durumunda çağırılacak fonksiyon

throw = Hatayı oluşturan kısım

alert\x281\x29 kısmı ise hata fonksiyonunun parametreleridir.

Dikkat ettiyseniz herhangi bir parantez işareti kullanılmadı ve bu şekilde bu kontrolüde bypass edebildik. Yukarıdaki payload Firefox ve Internet Explorer’da çalışmayabiliyor. Daha basit olarak kullanmak gerekirse:

onerror=alert;throw 1;

Payload dahada geliştirilebilir ve öğrendiğimiz unicode karakterler ile bir şeyler yapılabilir.

<img src=x onerror=" window.onerror=eval;throw'\u003d&#x0061;&#x006C;ert&#x0028;1&#41;' "/> 

Buraya kadar Client-Side filtrelemerini ve atlatma yöntemlerini gördük. Bu zafiyetin önüne geçmek için tarayıcılarda kendi taraflarında bir kaç önlem aldılar. Zaman bulursam bu konuyada değinirim yada siz araştırabilirsiniz. Derinlemesine XSS Bypass serimi burada sonlandırıyorum. Bu süreç içerisinde takıldığınız herhangi bir yer olursa sorabilirsiniz.

İyi günler dilerim

2 thoughts on “Derinlemesine XSS Bypass Bölüm 3

Leave a Reply

Your email address will not be published. Required fields are marked *