標籤:

jother編碼

本文總結自烏雲http://drops.wooyun.org/web/4410,本文為筆記,如有不懂歡迎討論或者移步原作者大作處。

jother編碼特點:

1、簡單,不需要太多演算法的知識。

2、是對JavaScript有了較深的了解後的產物。

學習之前的準備:

1、javascript匿名函數相關知識

2、javascript相關函數

3、javascript變數類型基本知識

4、遞歸思想

jother編碼:jother編碼是在javascript語言中,利用少量特定字元構造精簡的匿名函數對與字元串的編碼方式。我理解是,javascript中使用少量特定字元對匿名函數進行編碼加密。其中少量的特定字元包括:「+」、「!」、「(」、「)」、「[」、「]」、「{」、「}"。由此可見,1、遞歸在編碼過程中是必須的。2、編碼壓縮率大於100%或者更高,也就是說編碼後的長度比原長度長很多。

看如下例子:

[javascript] view plain copy

  1. alert([function(){
  2. alert(1);
  3. }()])

執行後先彈出1,再彈出空窗口。先執行了alert(1),然後外層的alert將function的返回值彈出。[javascript] view plain copy

  1. alert(function(){document.write("aa");});

執行後彈出aa並且網頁上顯示aa。也就是說,alert可以執行函數。[javascript] view plain copy

  1. alert([]);//"[]"是最簡單的函數,執行後什麼也不做,返回void。
  2. alert(+[]);//運算符「+」將返回值void強制轉換為數字0
  3. alert(![]);//運算符「!」將返回值void強制轉換為布爾值false.這個!並沒有對void取反,而只是單單將void轉換為布爾類型。
  4. alert(!![]);//將上面的false轉為true
  5. alert(+!![]);//將上面的true轉為數字1.

由上面的代碼,我們得到了數字 0、1的表達方式。於是,我們又得到了所有整數。[javascript] view plain copy

  1. "+[]",//0
  2. "+!![]",//1
  3. "!![]+!![]",//2
  4. "!![]+!![]+!![]",//3
  5. "!![]+!![]+!![]+!![]",//4
  6. "!![]+!![]+!![]+!![]+!![]",//5
  7. "!![]+!![]+!![]+!![]+!![]+!![]",//6
  8. "!![]+!![]+!![]+!![]+!![]+!![]+!![]",//7
  9. "!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]",//8
  10. "!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]"//9

它很酷,不是嗎? 只有數字還不行,我們需要字元,字元串。那麼數字如何變為字元串呢?這裡就有點文章可做了,我一開始想到的是ascii碼,但是如何將ascii碼轉換成字元呢?我們需要引入函數才行,但是能不能不引入新的函數?我們換一種思路來考慮這件事情:想辦法生成一個數組,然後用數組中已有的字元直接指定下標顯示。比如我們很容易就能產生的"true"、"false"。我們想要表示"a"的時候直接想辦法輸出一個"false",然後制定下標為"1"(注意這裡"f"的下標為"0",所以"a"就是"1")不就可以了嗎?

我們來證實一下:

[javascript] view plain copy

  1. alert((![])[+!![]])

怎麼樣?看到了a嗎?如果你回答:「看到了」,那麼你肯定沒有認真去動手做。這裡輸出的是「undefined」,這是為什麼呢?因為![]表示的是false這個false是bool型的,當我們取一個bool型變數下標的時候javascript是不能允許的,所以這裡給了一個undefined。那麼我們如何想辦法將bool型轉為字元串呢?這裡用到的是:"![]+[]"。

[html] view plain copy

  1. alert(typeof(![]+[]))

看到了嗎?變成了string。這裡就是說明了javascript在對bool類型和number類型做「+」運算的時候將其強制轉換為了string類型。大家也可以自己動手用alert(typeof(xxx))試著判斷一下之前提到的那些類型是否正確。

利用這個辦法,我們就可以表示"a"、"e"、"f"、"l"、"r"、"s"、"t"、"u"。當然還有一個很容易得到的字元串——"undefined",又可以豐富一下我們的字典。這樣,還是有很多字元無法表示,下面我們就來討論一種擴展,Object:

[javascript] view plain copy

  1. alert({});

在javascript中"{}"表示一個最簡單的類,如果運行上面的代碼,會顯示"[object Object]",同樣這個object也是不能直接按數組下標獲取元素的。聰明的小夥伴們,你們知道怎麼才能拿到"[object Object]"的字元嗎?就是它:[javascript] view plain copy

  1. alert(typeof({}+[]));

[javascript] view plain copy

  1. alert(({}+[])[+[]]);

這樣我們就得到了第一個字元「[」。做這個擴展其實主要是為了得到一個重要的字元"o",因為我們後面要說的sort函數需要用到它。

首先我們來補充一個前置概念——javascript匿名函數的原生形式

[javascript] view plain copy

  1. []["sort"]["constructor"]("函數體")();

這樣的構造可以執行任意javascript代碼。

利用jother編碼可以在不用字母和數字的情況執行任意js代碼,這個在XSS攻擊中是十分有用的,唯一的不足就是編碼太長了,如何縮短編碼,其實還是有些辦法的,而且結合真實的攻擊環境中可能允許輸入一些字元,我們就可以指替換部分代碼。比如代碼中對「alert」過濾,是否可以利用jother重新編碼函數,用匿名函數調用「alert」,在調用「alert」的時候僅替換alert中的r,這樣就形成了「ale」+xxx(jother)+「t」的形式。

下面就開始正式介紹如何利用jother編碼調用匿名函數,在第一篇內容中我們已經擁有了一些字元串,這些字元串中的每個字元我們都可以利用數組下標定位的方式取到,我們來看一下這些字元都有什麼:「true」、「false」、「undefined」、「[object Object]」(注意這裡有個很有用的字元空格)。我們來對比一下[]["sort"]["constructor"]1;我們還缺少什麼?其實已經什麼都不缺了。下面我們來構造這樣的一個形式,為了直觀我直接給出構造的結果:

[javascript] view plain copy

  1. [][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])()

這個例子實際上等價於: [javascript] view plain copy

  1. []["sort"]["constructor"]("returnlocation")()

注意這裡是return後面的空格就是需要用前面我們提到的[object Object]來取到。

有了這個函數我們就可以獲取很多有用的字元了,比如在線的話,就可以取到"http(s)://" 這樣就有了新的字元「p」。

有了這個字元以後我們就可以利用escape和unescape函數組合出更多的字母以及特殊符合,例如利用escape(" ");得到「%20」,利用「%」和數字字母組合再unescape得到新的字元。

後面的事情就由你來自由發揮了。

當然構造一些字母的時候還有其他的技巧,比如構造出Infinity 其實是利用數字接近無窮大,原理就是想辦法達到 e的100000次方,我們在這裡就不一一列出了,具體的思路可以參照附件中的jother.js,這是jother發明者寫的一段jother encode的demo。

這裡為了證明一開始提到的猜想我們給出一個不用任何字母和數字就能實現alert(1)的例子:

[javascript] view plain copy

  1. [][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+({}[[]]+[])[+[]]+({}[[]]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+([]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])())[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]])()([][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+([]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])())[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]])()(({}+[])[+[]])[+[]]+(!![]+!![]+[])+(!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]))+(+!![]+[])+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+({}[[]]+[])[+[]]+({}[[]]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+([]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])())[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]])()([][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+([]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])())[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]])()(({}+[])[+[]])[+[]]+(!![]+!![]+[])+(!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])))()

注意這裡我們由於用到了對"("、")"的編碼,其實就要用到escape和unescape,所以要在http(s)://協議下面使用,如果是本地文件那麼會取到"file://"導致無法正常執行。 最後給出jother編碼和解碼的方法:

編碼:我想如果你仔細閱讀了全文,這個問題對你來說應該很簡單了。

解碼:直接使用

alert(xxx)、console(xxx)、document.write(xxx)即可(xxx為編碼內容)。


推薦閱讀:

percent-encode 百分號編碼
編碼又見編碼
你也能懂的數據編碼入門
Python2.7字元編碼詳解
Base64編碼

TAG:編碼 |