一、题目分析

此靶场反射型跨站脚本漏洞包含在搜索查询跟踪功能中。该反射漏洞发生在一个 JavaScript 字符串中,该字符串包含经过转义的单引号和反斜杠,所以无法通过提前闭合单引号的方式写 JavaScript 代码,需要我们写入新的标签。

提示告诉我们为了解决这个实验,执行跨站点脚本攻击,注入点在 JavaScript 字符串,通过alert函数解决。

随便输入一个1发现:

  • 我们的输入被直接放进一个由单引号包裹的JavaScript变量 searchTerms 中。

  • 因为单引号 ' 被转义了,所以我们无法使用 ' 来闭合字符串,比如 '-alert(1)-' 这种payload是无效的。

  • 因为反斜杠 \ 也被转义,所以我们无法利用 \' 来进行绕过

既然无法从JavaScript字符串的“内部”进行突破(因为引号被转义),我们就需要改变思路,从“外部”进行攻击。

这里的关键在于:浏览器解析HTML的优先级高于执行JavaScript

浏览器在渲染页面时,会先扫描HTML代码。当它读到 <script> 标签时,它会一直向后寻找与之配对的结束标签 </script>。在这个寻找过程中,它不会去解析中间的JavaScript语法。

利用这一点,我们可以注入一个 </script> 标签来强行“闭合”当前这个不完整的脚本块,然后注入我们自己的新脚本块。

二、攻击过程

1、构造payload

</script><script>alert(1)</script>

2、攻击流程:

  1. 我们将这个Payload放到URL的 search 参数中。

  2. 服务器将Payload插入到JavaScript代码中,页面中的脚本块会变成这样

    <script>
        var searchTerms = '</script><script>alert(1)</script>';
        document.write(...);
    </script>
    
  3. 现在,浏览器开始解析这段HTML:

    • 它首先看到 <script>

    • 然后它开始向后寻找第一个 </script>。它在 searchTerms 变量的值里找到了我们注入的 </script>

    • 此时,浏览器会认为第一个 <script> 块在这里就已经结束了。里面的 var searchTerms = ' 会因为语法不完整而被忽略或报错,但这不影响后续的解析。

    • 接下来,浏览器看到了我们注入的第二个部分:<script>alert(1)</script>。它会认为这是一个全新的、完全合法的脚本块,并立即执行其中的代码。

    • alert(1) 函数被调用,屏幕上弹出提示框,靶场成功解决。

三、成功通关

更多推荐