PortSwigger靶场之Reflected XSS into a JavaScript string with single quote and backslash escaped通关秘籍

一、题目分析
此靶场反射型跨站脚本漏洞包含在搜索查询跟踪功能中。该反射漏洞发生在一个 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、攻击流程:
-
我们将这个Payload放到URL的
search参数中。 -
服务器将Payload插入到JavaScript代码中,页面中的脚本块会变成这样
<script> var searchTerms = '</script><script>alert(1)</script>'; document.write(...); </script> -
现在,浏览器开始解析这段HTML:
-
它首先看到
<script>。 -
然后它开始向后寻找第一个
</script>。它在searchTerms变量的值里找到了我们注入的</script>。 -
此时,浏览器会认为第一个
<script>块在这里就已经结束了。里面的var searchTerms = '会因为语法不完整而被忽略或报错,但这不影响后续的解析。 -
接下来,浏览器看到了我们注入的第二个部分:
<script>alert(1)</script>。它会认为这是一个全新的、完全合法的脚本块,并立即执行其中的代码。 -
alert(1)函数被调用,屏幕上弹出提示框,靶场成功解决。
-
三、成功通关

更多推荐
所有评论(0)