2016-07-01 12 views
0

ich in ein paar verschleierten Javascript bemerkt Exploit KitObfuscated Javascript in einem Exploit-Kit mit Konstruktor 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 

oder mit anderen Worten

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

Kann jemand erklären, was hier passiert? Was ist der Konstruktor eines Konstruktors eines Arrays?

+1

Sie können '[] .constructor.constructor' in jede JS-Konsole eingeben und selbst herausfinden. –

+0

Falls Sie neugierig sind, der Konstruktor von 'Function' ist auch eine' Funktion', also ist es eine zirkuläre Beziehung darüber hinaus. Hier ist die [MDN-Seite] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) für 'Funktion' – 4castle

+0

Ja, das ist die Ausgabe einer JS-Konsole. Der Schlüssel hier (der fehlte) ist, dass der Function-Prototyp ein String-Literal nimmt und eval darauf prüft. –

Antwort

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

ein

SO .. Was ist das?

[].constructor.constructor 

Funktion() {[native Code]}

Ahha ... so ist es nur eine Möglichkeit, den Function Konstruktor aufzurufen, die einen String ... eval nimmt dann die letzten Parens rufen es auf.

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

ein

+0

Danke. Hier ist der Prototyp des Konstruktors neue Funktion ([arg1 [, arg2 [, ... argN]],] functionBody) Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Funktion –

0

Sie [].constructor.constructor in jede JS-Konsole eingeben können und für sich selbst herausfinden.

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