# JSFuck ## JSFuck 簡介 JSFuck 利用 JavaScript 弱型別的特點,以非常極端的方式構造出 JS 程式。 在 JSFuck 中,共使用了 `[` 、 `]` 、 `(` 、 `)` 、 `!` 、 `+` 建構程式,並且,使用 JSFuck 構造出的程式能夠直接被瀏覽器執行,因此,我們也可以利用它進行 Web Exploit 。 ## JSFuck 解析 要讓所有程式轉換為僅用 6 種字元構造而成的程式碼,就必須一步一步的從數字、字母再到函式一個造輪子。 我們如果將下方程式丟到 console 執行,會得到 `true`: ```js= Boolean([]) ``` 同樣的,我們也可以類似的方式得到 `false`: ``` Boolean(![]) ``` > **補充**: > ```js= > [] == ![] > ``` > 在相等運算中,計算結果會與 `Boolean()` 得到的結果有所出入,如果我們使用 `==` 時,有一邊為 bool 值, JS 會把 `true` 轉成 1 , `false` 轉成 0 。 > ```js= > [] == 0 > ``` > 當有一邊是數字,另一邊也會變成數字: > ```js= > 0 == 0 // true > ``` 到這邊,我們已經成功構造出 `true` 以及 `false` ,接著,讓我們以此基礎創造出數字吧! ### 數字 要使用僅有的字母構造出數字,我們需要善用 `+` 運算子。 當我們在 JS 當中使用 `+` 時,它會將運算元轉換成數字 (型別轉換)。 有了這個基礎,我們可以這樣構造出數字 `0`: ```js= +[] ``` 構造出了 `0` 以後,我們可以利用 `!` 構造出 `1`: ```js= !+[] // true +true // 1 /* So: */ +!+[] // 1 ``` 有了 0 跟 1 以後,要構造其他數字就更容易了: ```js= !+[]+!+[] // 2 ``` ```js= [+[]] // [0] [+!+[]] // [1] [+!+[]] + 0 // "10" [+!+[]]+[+[]] // "10" ``` ```js= +[![]] // NaN ``` ### 字母 從剛剛的範例中,我們可以觀察到一件事情: ```js= [+!+[]] + 0 // "10" ``` 利用這個方式,我們可以構造出字母,自於這些字母怎麼來呢? 當然就是從 `NaN` 、 `true` 、 `false` 上提煉啦! ```js= [![]]+[] // "false" ``` 上面的範例中,我們得到了字串 `"false"` ,有了這個字串,我們就可以拿到它的字元,像是: ```js= "false"[0] // "f" "false"[+[]] // "f" /* So: */ ([![]]+[])[+[]] // "f" "H"+"i" // "Hi" ``` ## Reference - [JSfuck原理解析一——基础原理](https://blog.csdn.net/qq_36539075/article/details/79946099) - [維基百科](https://zh.wikipedia.org/wiki/JSFuck) - [JSFuck](https://github.com/aemkei/jsfuck)