发布:2022年9月12日在13:00 UTC
更新:2022年9月18日在17:20 UTC
我以为我知道所有可以在没有括号的情况下调用函数的方式:
警报`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.navigate
Chrome中的方法导致重定向,有效载荷来自window.name
。为了打电话导航
您需要向函数提供正确的“ thisObject”,这是在第二个参数中完成的反思
。这window.name
在第三参数中使用,该参数必须是发送到该函数的一系列参数。使用反映
方法设置并应用您可以分配给几乎任何对象或调用任何功能!请注意,我正在使用“ window.name”来隐藏有效载荷,通常,有效载荷将来自另一个页面或域,通过将其传递到跨域传递的窗口的“名称”属性中。
令人惊讶的是,模板字符串支持此行为,并且浏览器允许您以这种方式使用排序和其他功能。通过入侵JavaScript,您可以学习滥用JavaScript功能以产生意外结果的新有趣方法。
我希望并期待看到有人找到第八个无需括号的JavaScript的方法!