JavaScript 中的 constructor.constructor()() 是什么?

What is constructor.constructor()() in JavaScript?

提问人:Alvaro 提问时间:4/6/2022 最后编辑:Heretic MonkeyAlvaro 更新时间:4/6/2022 访问量:807

问:

我在 h1 上寻找错误,我找到了一种方法来使用 Angularjs、Nodejs 和其他 JavaScript 库在网站上触发警报框,我希望真正了解这里发生了什么,但还没有找到确切的信息。constructor.constructor()

确切的有效载荷是

constructor.constructor('alert(1)')()

我只在定义函数和类的过程中找到了关于构造函数的信息,而不是作为“函数”的信息(不太确定在这种情况下这是什么)。而且我不确定触发警报框的上下文是现有的库之一,还是仅仅因为 JavaScript 和 DOM。

有人知道什么是吗?它是如何工作的?constructor.constructor()()

PS:有效负载也放在 {{ }} 中,但它显然只是 JavaScript,而不是实际的 SSTI(7*7 由 DOM 解析但保留在源代码中)

JavaScript 节点:.js angularjs dom

评论


答:

3赞 zzzzBov 4/6/2022 #1

对象实例具有对其构造函数的引用:

const o = {};
o.constructor === Object;

如果不引用任何对象,则在实例的全局上下文中执行该属性,这与:windowwindow.constructor

constructor /* or window.constructor */ === Window;

Window并且是函数实例,因为函数也是 JavaScript 中的对象,这意味着构造函数是ObjectFunction

constructor.constructor /* or Window.constructor */ === Function;

该函数可用于使用字符串输入作为函数体来创建函数实例(类似于 ),因此在传入结果的示例中,是一个在执行时调用的函数:Functioneval'alert(1)'alert(1)

Function('alert(1)');
// is the same as
function () {
  alert(1);
}

最后,最后一个括号在没有任何参数的情况下执行该函数,这就是为什么您会看到警报显示为 .1