2016-07-01 28 views
0

我注意到一些模糊JavaScript中的漏洞利用工具包模糊JavaScript在開發套件使用Array的構造

> a = []["constructor"] 
Array() { [native code] } 
> b = a["constructor"] 
Function() { [native code] } 
> b("console.log('a');") 
anonymous() { 
    console.log('a'); 
} 
> b("console.log('a');")() 
a 

,或者換句話說

> [].constructor.constructor("console.log('a');")() 
a 

有人能解釋這裏發生了什麼? Array的構造函數的構造函數是什麼?

+1

您可以在任何JS控制檯中輸入'[] .constructor.constructor'並找出你自己。 –

+0

如果您好奇,Function'的構造函數也是一個'Function',所以它是一個循環關係。這是[函數]的[MDN頁面](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) – 4castle

+0

是的,這是JS控制檯的輸出。這裏的關鍵(我錯過了)是函數原型需要一個字符串文字並對它進行評估。 –

回答

1
[].constructor.constructor("console.log('a');")() 

一個

所以..這是什麼?

[].constructor.constructor 

功能(){[本地代碼]}

AHHA ...所以它僅僅是一個調用Function構造函數,它需要一個字符串給eval方式...然後最後的父親援引它。

Function("console.log('a')")() // Works with or without `new` 

一個

+0

謝謝。這裏是構造函數的原型新函數([arg1 [,arg2 [,... argN]],] functionBody) Ref:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /功能 –

0

您可以輸入[].constructor.constructor到任何JS控制檯,並找到自己。

[].constructor 
    -> Array() { [native code] } 
[].constructor.constructor 
    -> Function() { [native code] } 
[].constructor.constructor("console.log('a');")() 
-> a