有人在Twitter上发布了Imperva Web应用程序防火墙的跨站点脚本旁路(不确定是否可以在此处链接)。如下所示:
<a/href="j%0A%0Davascript:{var{3:s,2:h,5:a,0:v,4:n,1:e}='earltv'}[self][0][v+a+e+s](e+s+v+h+n)(/infected/.source)" />click%0A%0解码为新行。创建到给定URI的可点击链接。但是所有的3:s和v+a+e等等我都完全不懂。我尝试过在反射、存储和DOM XSS中使用它,并得到了混合结果。事实上,在某些情况下,Imperva WAF检测不到它,但在某些情况下,它是检测到的,在许多情况下,它根本不会导致可点击的链接。现在的问题是我不能完全理解javascript代码。任何帮助都是非常感谢的。
发布于 2021-03-06 05:23:45
你说得对,%0A%0D解码成了一个新的行!这就是:javascript:{var{3:s,2:h,5:a,0:v,4:n,1:e}='earltv'}[self][0][v+a+e+s](e+s+v+h+n)(/infected/.source)
现在让我们来分析一下。
var{3:s,2:h,5:a,0:v,4:n,1:e}='earltv'
这表示字符串'earltv'的第三个索引将是s,第二个索引将是h,第五个索引将是a,依此类推。
[self][0]
这本质上除了引用它自己什么也不做。
[v+a+e+s]
现在是解码开始的地方。
V实际上是e(字符串的索引为0)
A实际上是v(字符串的索引5)
等。
然后解码成eval。
类似地,(e+s+v+h+n)解码为alert。
因此,我们有:
eval(alert)(/infected/.source)
/infected/是一个正则表达式,而.source引用的是它的源,也就是字符串"infected"。
现在,这相当于:
eval (alert) ("infected")
eval (alert)本质上返回警报的本机代码,因此这只是alert。
alert("infected")
现在它很简单-它只是提醒“被感染”,这就是实际发生的事情!
发布于 2021-03-06 05:32:43
除了另一个答案之外,这里还有一个简化的工作演示,展示了它的功能。
编辑:一些额外的解释
如果我们将[0]附加到一个字符串上:
let first_letter = "Hey!"[0]; //returns "H"这意味着当请求对字符串进行数组操作时,该字符串将被“转换”为数组:
因此它等于:
let first_letter = ["H","e","y","!"][0]现在,如果你有一个对象,你可以用数组来填充它:
let obj = {0:h,1:e,2:y,3:I} = ["H","e","y","!"];最后,您可以将其与析构相结合:
letters = ["H","e","y","!"];
({0:h,1:e,2:y,3:I} = letters)
console.log(h,e,y,I); //returns "H" "e" "y" "!"
坦率地说,非常简单和酷:)
原始代码段:
var {
3: s,
2: h,
5: a,
0: v,
4: n,
1: e
} = 'earltv'
console.log(v + a + e + s , e + s + v + h + n, (/infected/.source));
https://stackoverflow.com/questions/66499658
复制相似问题