Merhaba arkadaşlar blog yazmayalı uzun zaman oldu bakalım hala yazabiliyor muyum?
Merhaba Dünya ile başlayalım! = eval(alert("Merhaba Dünya"));
http://jsfiddle.net/kge6pekp/
Olayın özeti alfanümerik karakterler kullanmadan (a-z A-Z 0-9) js motorunda çalışan JavaScript kodları yazmaktan ibaret. (yazıda performans değerlendirmesi yapmayacağım merak edenler bknz: benchmark) birde olayın keşif boyutu var 2009 yılında kıymetli dostumuz RSnake in forumu sla.ckers.org dan isimsiz bir cengaver "document.cookie" waf a takılıyor diye biraz kafa yormuş iyide olmuş.
Kodlamanın temelinde yatan hassas konu JavaScript motorunun yapısı gereği boş nesne(object) veya dizilerden(array) değişken üretebiliyor ,çeşitli operatorlerle boolean(true,false) çıktılar verebiliyor bunların string veya integer olarak birleştirilmesiyle bütün bir javascript kodu oluşturduğunuzda bunları javascript fonksiyonu olarak çalıştırabiliyor.
Yani basit encoder mantığıyla ;
Armutu bırakıp JavaScript e geçersek denemeler için firefox yada chrome geliştirici konsolunu kullanabilirsiniz;
Armut örneğinde olduğu gibi javascript kodlarını yazabilmemiz için alfanümerik karakterleri alfanümerik olmayan karşılıkları ile eşitlememiz gerekecek yani kodlamada kullanacağımız her harf i javascript çıktılarından ayırmamız gerek
Kullanacağımız fonksiyon ve operatorler;
[] = arrayi stringe dönüştürürken, dizi elemanlarını indise göre okurken , nesne özelliklerini kullanırken
() = fonksiyon kullanırken
+ = varolan stringe ekleme yaparken,elemanları birleştirirken yada toplarken
! = boolean çıktı için
{} = hata mesajı yada NaN çıktısı için
Rakamlar için;
Alfanümerik olmadan;
Şuan elimizde 0 ,1 ve -1 var bunları kullanarak 0 dan 9 a tüm rakamları yazdırabiliriz ve bu rakamları kullanarak tüm sayıları yazdırabiliriz
Rakamlar;
0 dan 9a rakamları oluşturduğumuza göre istediğimiz sayıyı oluşturabiliriz
Misal 08 yazmak için [] ile 0 ve 8 i birleştiriyorum
Sadece rakamlarla javascript yazamayacağımıza göre cümle kurmak için harfleri de alalım.
Harfler ve Karakterler için;
Harfleri almak için js motorunun döndürdüğü bazı hata mesajı ve çıktılardan faydalanmamız gerekiyor harfleri tek tek okuyarak rakamlarda yaptığımız gibi tutmamız gerekiyor.
Alabildiğimiz basit çıktılar
Bu çıktıları içlerinden harfleri alabileceğimiz kelimeler olarak düşünün amacımız bu kelimeler içerisinden harfleri ve karakterleri tek tek alıp kendimize alfanümerik değişkenler oluşturmak yani "true" içerisinden "t" "r" "u" ve "e" yi "false" içerisinden de "f" "a" "l" "s" harflerini aldığımızda "a" "e" "f" "l" "r" "s" "t" "u" harfleri elimizde kullanmaya hazır olacak "[object Object]" içerisinden '"' '[' ']' 'o' 'b' 'j' 'c' 't' '0' yu aldığımızda elimizdeki harf ve karakter sayısı arttığı için javascript kodumuzu yazmak için elimizde bayağı harf ve karakter bulundurmuş olacağız.
Harf ve karakterleri alacağımız mesajı stringe çevirip karakter karakter alacağız.
"true"[0] = t gibi
Test edip "tr" yi alert ettirelim
alert([ !!~[]+[] ] [~~[] ] [ ~~[] ]+ [ !!~[]+[] ] [~~[] ] [ -~[] ]);
http://jsfiddle.net/6beyj4n4/
Bu akşam burada kalsın yarın devam ederim yatıyorum..
Ara verince aynı iştahla yazılmıyor demekki neyse.
Yukarıda anlattığım olayları tekrar hatırlarsak alfanümerik olmayan karakterler ile javascript kodları yazabilmek için rakamlar harfler ve karakterlerin alfanümerik olmayan karşılıkları ile kendimize bir harita çıkarmamız gerekiyor biz zaten dün a e f l r s t u o b j c O " [ ] ve 1 2 3 4 5 6 7 8 9 0 olan kısmı alfanümerik kullanmadan oluşturduk en azından alert() i alfanümerik olmadan çalıştırabiliriz tüm harfleri ve karakterleri tamamlamak isterdim fakat şuan o angarya modunda değilim.
Farkettim de sadece true yu harflerine ayırmışım false ı da ayırayım ki alert yazdırabilelim
"false"[0] = f
e yi zaten true yu ayıklarken yaptık
o halde string olarak
eval içinde kullanım
Tabiki eval i de alfanümerik kullanmadan yazdırabiliriz yazılmışları da var fakat şu an eval için v harfini çıkarmak bana zulüm!
eval(alert(1)); i non-alphanumeric olarak yazarken eval("alert")(1) olarak yazmak demek işin kolayına kaçmak demek ben de öyle yapıyorum.
Başlangıç seviyesi için anlatacaklarım bu kadar olurda bir aksilik olmazsa ileriki zamanlarda tüm karakterleri tamamlamış halde kendi non-alphanumeric encoderim ile XSS saldırılarında WAF bypass konusuna değineceğim.
Değişik syntaxlı kullanmaya hazır muadiller için
0 comments:
Yorum Gönder