当我无所适从XSS挑战时,在使用Javascript中的模板字符串(“而不是括号”)创建Function对象时遇到了奇怪的行为。
据我了解,在调用
时
alert`1`
基本上与
相同
alert(["1"])
,如here所述。我测试了很多情况,并且在所有这种情况下都以这种方式工作-除非使用模板字符串创建Function对象。
执行以下代码时:
var x = new Function`alert(1)`;
console.log(x.constructor);
Object类的实例是在其构造函数主体中使用alert(1)函数创建的,因此可以立即执行。
如果我理解正确,则应与
相同地执行
var y = new Function(["alert(1)"]);
console.log(y.constructor)
,并且应该只在主体中返回带有alert(1)的Function对象,以便可以这样调用
var y = new Function(["alert(1)"]);
y();
这种不一致的原因是什么?创建对象时模板字符串的处理方式有何不同?
答案 0 :(得分:4)
您误解了各种语言语法的优先顺序。
var x = new Function`alert(1)`;
等同于
var x = new (Function`alert(1)`);
所以您实际上要做的是
var fn = Function`alert(1)`;
var x = new fn;
因此,您已经创建了函数,然后使用new
对其进行了调用。