呼叫JavaScript函数的第七条无需括号

带有梯度背景的JavaScript代码

我以为我知道所有可以在没有括号的情况下调用函数的方式:

警报`1337`
扔onerror =警报,1337
function`x $ {'alert \ x281337 \ x29'} x````
'alert \ x281337 \ x29'instanceof {[符号['hasinstance']]:eval}
valueof = alert; window+'''
x = new dommatrix; matrix = alert; x.a = 1337; location ='javascript'+':'+x
//或任何domxss and,例如位置=名称

在这篇文章中,我将向您展示另一种令人惊讶的方式,并帮助您了解标记模板字符串的工作方式。这篇文章中的技术不能直接启用剥削,但可以用来更了解JavaScript语言,从而为逃避JavaScript沙盒和WAF提供基础。一切都从我的帖子开始执行无括号的非alphanumeric JavaScript。我发现您可以将字符串传递给标记的模板,标记的模板只是意味着在字符串字符串之前使用前缀。例如警报`123`是一个标记的模板,调用警报功能123。我在上一篇文章中的认识是,您可以将多个参数传递给这些函数,因为这些函数只有字符串,如以下代码所示:

功能x(){
警报(参数[0]);
警报(参数[1]);
}
x`x $ {'ale'+'rt(1)'} x`

这里发生的事情是所有字符串在第一个参数中添加为数组,第二个参数获取字符串警报(1)但是等等为什么字符串警报(1)通过第二个参数传递给该功能?好吧,琴弦的对待与占位符的对待不同,没有占位符的普通字符串将被添加到第一个论点中,而占位符将作为其类型的新论点添加。最后一点很重要,当时我没有意识到的是,占位符被添加为与他们的类型的争论,而不是作为字符串!以下代码证明了这一点:

功能x(){
警报(参数[0]);
参数[1]('Hello')
}
功能y(str){
警报(str);
}
x`x $ {y} x`

太好了,这是很酷的行为,这意味着我们可以调用功能并通过任何类型传递多个参数。但是我们有一个问题,当在标记模板中使用字符串时,它们将始终添加为第一个参数,从而破坏使用第一个参数的函数。我们的目标是用我们选择的参数调用功能。例如,我们可能想致电Settimeout因为第一个参数接受函数或字符串,而第三个参数调用该值函数以该值:

settimeout(警报,0,“我被传递给警报”)

让我们尝试打电话Settimeout

settimeout` $ {alert} $ {0} $ {1}`// uck offuack syntaxerror:意外令牌','

我们可以通过再次使用自定义函数看到正在发生的事情:

功能x(){
console.log(参数);
}
x` $ {alert} $ {0} $ {1}`

控制台的控制台的屏幕截图,显示发送给该函数的参数

因此,我们可以看到第一个参数包含一系列空白字符串和另一个数组,末端再次充满了空白字符串。什么时候Settimeout将这些数组转换为一个字符串,我们会得到一堆逗号,这会导致语法错误。不知何故我们需要Settimeout忽略第一个参数的功能,您该怎么做?好吧,你可以使用settimeout.call因为第一个参数将是分配给“此”的数组Settimeout功能和现在的警报将作为第一个参数传递给该函数,但是…

settimeout.call` $ {alert} $ {0} $ {1}`//非法调用

该死,因为您不再直接调用该函数,所以JavaScript会引发一个例外,以阻止您调用该功能,因为“此”不再是窗口对象。我以为游戏结束了,然后我意识到过去已经做了一些JS黑客攻击[]。种类和别的。它们允许您在没有非法调用错误的情况下调用函数:

[] .sort.call` $ {alert} 1337``

您当然可以使用其他功能,例如评估和其他数组方法地图

[] .map.call` $ {eval} \\ u {61} lert \ x281337 \ x29`

我后来发现您可以使用反映也:

显示一些使用反射的代码。应用调用导航函数

以上使用新的navigation.navigateChrome中的方法导致重定向,有效载荷来自window.name。为了打电话导航您需要向函数提供正确的“ thisObject”,这是在第二个参数中完成的反思。这window.name在第三参数中使用,该参数必须是发送到该函数的一系列参数。使用反映方法设置并应用您可以分配给几乎任何对象或调用任何功能!请注意,我正在使用“ window.name”来隐藏有效载荷,通常,有效载荷将来自另一个页面或域,通过将其传递到跨域传递的窗口的“名称”属性中。

结论

令人惊讶的是,模板字符串支持此行为,并且浏览器允许您以这种方式使用排序和其他功能。通过入侵JavaScript,您可以学习滥用JavaScript功能以产生意外结果的新有趣方法。

我希望并期待看到有人找到第八个无需括号的JavaScript的方法!

回到所有文章

相关的研究

每日Swig的推荐故事beplay2018官网