JSFuck


alert(1)JSFuck(或為了避諱髒話Fuck寫作 JSF*ck )是一種深奧的 JavaScript 程式設計風格。以這種風格寫成的代碼中僅使用 [、]、(、)、! 和 + 六種字元。此程式設計風格的名字衍生自僅使用較少符號寫代碼的Brainfuck語言。與其他深奧的程式語言不同,以JSFuck風格寫出的代碼不需要另外的編譯器或直譯器來執行,無論瀏覽器或JavaScript引擎中的原生 JavaScript 直譯器皆可直接執行。鑑於 JavaScript 是弱型別語言,編寫者可以用數量有限的字元重寫 JavaScript 中的所有功能,且可以用這種方式執行任何類型的表達式。[1]
緣起
[編輯]長谷川陽介[註 1](Yosuke Hasegawa)於2009年7月建立了一個名為「jjencode」的網絡應用程式,可將一切的JavaScript代碼混淆為[]()!+,\"$.:;_{}~=這十八個字元的排列組合[2][3]。
2010年1月,在一個Web應用程式安全站點上的「混淆」版塊內,舉行了一場非正式的競賽。這場競賽的目標是讓JavaScript程式設計將所需的最少字元降至八個以下([]()!+,/),而該帖文的回覆者們設法消除了對,和/字元的需求[4]。截至2010年3月,網上有一個名為「JS-NoAlnum」的線上編碼器,它只使用六個字元來混淆JavaScript[5]。
2010年底,長谷川陽介製作了一個名為JSF*ck的新編碼器,它只使用了六個字元來混淆JavaScript[6][7]。2012年,馬丁·克萊普在GitHub上建立了一個編碼器專案「jsfuck」[8],並建立了JSFuck.com網站,放置了一個使用該編碼器實現的Web應用程式[9]。
用途與安全性
[編輯]JSFuck可用於代碼混淆,一個最佳化版JSFuck編碼器已經被用於混淆jQuery代碼,使這一流行的JavaScript函式庫可以僅使用六個字元來實現原本的所有功能[10]。
此外,JSFuck可用於繞過惡意代碼檢測,且可以被用於跨站指令碼攻擊[11]。因為缺乏原生JavaScript應有的特徵,類似JSFuck的JavaScript混淆技術可幫助惡意代碼繞過入侵防禦系統或內容過濾器[12]。現實中,因為JSFuck中缺少字母數字字元,且eBay中的內容過濾器曾存在缺陷,使得賣家曾經可以在他們的eBay拍賣頁面中嵌入任意JSFuck指令碼[11]。
編碼方式
[編輯]JSFuck代碼非常冗長。在JavaScript中,alert("Hello World");這一代碼將導致彈窗並顯示「Hello World」字串,這一代碼的長度為21個字元。在使用JSFuck.com提供的JSFuck混淆程式後,轉換出對應的相同效果代碼長度為24691個字元。本節概述此轉換方式的工作原理。
數字
[編輯]數字0使用+[]來構造,其中[]代表空陣列,而+是一元加運算子。
數字1則以+!![]或+!+[]來構造,其中!![]或!+[]代表布林值為真(true),而前置的一元加運算子將真值轉換為數字1。
數字2至9則以將「真」加和多次後轉換為數值的類似方式來構造。例如,由true + true這一表達式在JavaScript中輸出結果為2,又true可寫作!![]或!+[],故2可轉寫作!![]+!![]或!+[]+!+[]。
多位的整數則可將各數碼分別表示,並使用串接運算子+進行字串串接。例如字串"10"可表達為兩個陣列串接的形式([1] + [0]),將各數碼替換為對應的JSFuck表達式後,即可將這一字串表達為[+!+[]]+[+[]];若要將字串轉化為數字,可將前述的表達式括在括號或方括號中,並加上一個+運算子,因此,數字值10可在JSFuck中表達為+([+!+[]]+[+[]])。[13]
字母
[編輯]通過使用索引器(即方括號中的數字)的方式,可以訪問簡單布林值或數值對應字串表示形式(如false、true、NaN、undefined)中的單個字元,而JSFuck可以藉此轉換一部分字母。此外,轉換另一部分字母需要其他技巧,例如將字串1e1000轉換為數字,這樣就會產生無窮大值(Infinity),而Infinity中的字元可以用於取得字母y。[13]
| 值 | 經JSFuck轉化後 |
|---|---|
false |
![]
|
true |
!![]或!+[]
|
NaN |
+[![]]或+[][[]]
|
undefined |
[][[]]
|
Infinity |
+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])
|
其他構造方法
[編輯]在JavaScript中,Function函數這種構造器可被用於觸發執行包含在字串中的JavaScript代碼,正如像執行原生JavaScript代碼那樣。例如,陳述式alert(1)等價於Function("alert(1)")()。而Function構造器在JavaScript中是任何常用函數的constructor屬性,此處所言的常見函數指的是像[]["filter"](即Array.prototype.filter)之類的函數。於是,這個構造器便可以通過訪問一個空陣列的filter屬性下的constructor屬性來構造。例如,alert(1)可被等價轉換為[]["filter"]["constructor"]("alert(1)")(),並使用JSFuck進一步轉換。[13]
備註
[編輯]- ^ 參見其Facebook頁面上的影片
- 對於「編碼方式」章節中的內容:
參考來源
[編輯]- ^ Jane Bailey. Bidding on Security. The Daily WTF. 2016-02-29 [2018-07-12]. (原始內容存檔於2016-03-02).
- ^ Hasegawa, Yosuke. jjencode - Encode any JavaScript program using only symbols. utf-8.jp. 2009-07-10 [2017-10-25]. (原始內容存檔於2009-07-15).
- ^ Hasegawa, Yosuke. UTF-8.jp. utf-8.jp. 2009-07-28 [2017-10-25]. (原始內容存檔於2009-07-28).
- ^ Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code. Sla.ckers. 2010-01-14 [2017-10-25]. (原始內容存檔於2011-03-01).
- ^ js-noalnum_com.php. discogscounter.getfreehosting.co.uk. [2017-10-25]. (原始內容存檔於2010-03-01).
- ^ Hasegawa, Yosuke. JSF*ck - []()!+. utf-8.jp. November 2010 [2017-10-25]. (原始內容存檔於2010-12-01).
- ^ Hasegawa, Yosuke. UTF-8.jp. utf-8.jp. 2010-11-30 [2017-10-25]. (原始內容存檔於2010-11-30).
- ^ Kleppe, Martin. Commits · aemkei/jsfuck. Github. 2012-07-16 [2017-10-25]. (原始內容存檔於2018-07-13).
- ^ JSFuck - Write any JavaScript with 6 Characters: []()!+. JSFuck. [2018-07-12]. (原始內容存檔於2018-07-01).
- ^ Trotta, Francesco. fasttime/jquery-screwed. GitHub. [2018-07-12]. (原始內容存檔於2016-03-06).
- ^ 11.0 11.1 eBay has no plans to fix “severe” bug that allows malware distribution [Updated]. rstechnica. 2016-02-03 [2018-07-12]. (原始內容存檔於2016-12-02).
- ^ Bypassing WAFs with non-alphanumeric XSS.~ Infobyte Security Research Labs. INFOBYTE SECURITY RESEARCH LABS. 2012-09-17 [2018-07-13]. (原始內容存檔於2018-03-07).
- ^ 13.0 13.1 13.2 jsfuck/README.md at master · aemkei/jsfuck · GitHub. GitHub. [2018-07-12]. (原始內容存檔於2018-07-13).
外部連結
[編輯]- [//web.archive.org/web/20180701031439/http://www.jsfuck.com/ 頁面存檔備份,存於互聯網檔案館) JSFuck - Write any JavaScript with 6 Characters: []()!+] – 將原生JavaScript轉換為JSFuck的Web應用程式
- Yosuke Hasegawa創作的JSF*ck線上應用(頁面存檔備份,存於互聯網檔案館)
- JSfuck.com所用的轉換指令碼 (頁面存檔備份,存於互聯網檔案館)