Alfanümerik karakter kullanmadan (non-alphanumeric) JavaScript kodlama


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 ;

[a    b    c    d    e    f    g    h    i    j    k    l    m    n    o    p    q    r    s    t    u    v    w    x    y    z]  array olduğunu varsayarsak altlarında indisleri yazılı
 0    1     2    3     4   5  6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25
a=0; r=17; m=12; u=20; t=19;  şeklinde tanımlarsak "armut" yazmak için "0","17","12","20","19" yazmamız yeterli.

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;

var degisken="";//bos
++degisken; // 1 döndürdü
--degisken; // -1 döndürdü

Alfanümerik olmadan;

[] // boş
+[] // o döndrdü
~~[] // 0 döndürdü
-~[] // 1 döndürdü
~~[] // -1 döndürdü
!+[] // 0 döndürdü
+!![] // 1 döndürdü
-!![]// -1 döndürdü

Ş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 = ~~[]
1 =- ~[]  // String olarak istersek sonuna +[]  eklememiz yeterli -~[]+[]
2 = -~[]+-~[] // 1+1
3 = -~[]+-~[]+-~[] // 1+1+1
4 = -~[]+-~[]+-~[]+-~[] // 1+1+1+1
5 = -~[]+-~[]+-~[]+-~[]+-~[] /1+1+1+1+1
6 = -~[]+-~[]+-~[]+-~[]+-~[]+-~[] // 1+1+1+1+1+1
7 = -~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[] // 1+1+1+1+1+1+1
8 = -~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[] // 1+1+1+1+1+1+1+1+
9 = -~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[] // 1+1+1+1+1+1+1+1+1

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

08 = ~~[]+[ -~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[]+-~[] // 0+[8]
34 = [ -~[]+-~[]+-~[] ] + [ -~[]+-~[]+-~[]+-~[]  ] // [3] + [4] 

 

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

true  = !!~[]
false = !~[]
"[object Object]" = []+{}
NaN = +{}
undefined = [][~[]] 

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

t= [ !!~[]+[] ] [~~[] ] [ ~~[] ] // true yu stringe çevirip ilk karakteri okuduk   [ true + [] ] [ 0 ] [ 0 ]
r=  [ !!~[]+[] ] [~~[] ] [ -~[] ]  // true yu stringe çevirip 2.karakteri okuduk   [ true + [] ] [ 0 ] [ 1 ]
u= [ !!~[]+[] ] [~~[] ] [ -~[]+-~[] ] // true yu stringe çevirip 3.karakteri okuduk [ true + [] ] [ 0 ] [ 2 ]
e =[ !!~[]+[] ] [~~[] ] [ -~[]+-~[] +-~[] ] // true yu stringe çevirip 4.karakteri okuduk  [ true + [] ] [ 0 ] [ 3 ]

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 

f = [!~[]+[]][~~[]][~~[]] 
a = [!~[]+[]][~~[]][-~[]]
l = [!~[]+[]][~~[]][-~[]+-~[]]
s = [!~[]+[]][~~[]][-~[]+-~[]+-~[]]

e yi zaten true yu ayıklarken yaptık

 o halde string olarak

alert = [!~[]+[]][~~[]][-~[]]+[!~[]+[]][~~[]][-~[]+-~[]]+[ !!~[]+[] ] [~~[] ] [ -~[]+-~[] +-~[] ] +[ !!~[]+[] ] [~~[] ] [ -~[] ] + [ !!~[]+[] ] [~~[] ] [ ~~[] ] // "alert" döndürüyor

 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.

eval([!~[]+[]][~~[]][-~[]]+[!~[]+[]][~~[]][-~[]+-~[]]+[ !!~[]+[] ] [~~[] ] [ -~[]+-~[] +-~[] ] +[ !!~[]+[] ] [~~[] ] [ -~[] ] + [ !!~[]+[] ] [~~[] ] [ ~~[] ] )(-~[])

 

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 

jsfuck.com
http://utf-8.jp/public/aaencode.html
http://utf-8.jp/public/jjencode.html
http://deftcode.ninja/post/non-alphanumeric-javascript-coding/