PortSwigger靶场之Reflected DOM XSS通关秘籍

发布于:2025-09-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

这个靶场是用于理解和解决“反射型 DOM XSS” (Reflected DOM XSS) 漏洞。下面是解决这个靶场的详细步骤和思路:

一、漏洞原理简介

反射型 DOM XSS 的特点是:

  1. 你的输入(Payload)会先被发送到服务器。

  2. 服务器将你的输入未经处理地“反射”回浏览器,出现在页面的 HTML 响应中。

  3. 页面上的一段 JavaScript 脚本获取了这个被反射回来的数据。

  4. 该脚本没有安全地处理这些数据,并将其传递给一个危险的“接收器”(Sink),例如 innerHTMLdocument.write(),从而导致你的恶意脚本被执行。

简单来说,这是一个结合了反射型 XSS 和 DOM-based XSS 的漏洞。


二、解决步骤

第一步:访问靶场并找到输入点

我们看到一个带有搜索功能的页面,这个搜索框就是我们的输入点。

第二步:寻找数据是如何被反射的

  1. 在搜索框中输入一个独一无二、容易识别的字符串,例如 12345,然后点击搜索。

  2. 页面刷新后,右键点击页面,选择“检查” (Inspect) 或“查看网页源代码” (View Page Source),搜索你刚刚输入的字符串 111

第三步:分析反射点的上下文

真正的漏洞点,也是最危险的地方,在这里:

eval('var searchResultsObj = ' + this.responseText);

这行代码是整个攻击的核心。

  • this.responseText: 正如我们在Burp Suite截图中看到的,这就是从服务器返回的整个JSON字符串,例如

{"searchTerm":"111"}
  • eval() 函数: 这是一个极其危险的函数,它会将传入的字符串当作JavaScript代码来执行。

所以,这行代码的作用是:将服务器返回的JSON数据拼接成一个完整的JavaScript语句,然后直接执行它。

(1)攻击路径的最终确认

现在,我们可以知道我们输入双引号被转义,得到一个完整且清晰的攻击路径:

  1. 输入与反射: 您通过URL (?search=...) 输入Payload。服务器将其放入JSON响应中返回。

  2. 服务器转义: 服务器会将您输入的双引号 " 转义成 \"

  3. 客户端接收: 浏览器中的 XMLHttpRequest 接收到这个JSON字符串 (this.responseText)。

  4. 危险的eval: 代码执行 eval('var searchResultsObj = ' + '{"searchTerm":"您的输入被转义后的结果"}')

  5. 注入与绕过:

    • 我们提交的Payload是 

      \"-alert(1)}//
    • 服务器转义后,this.responseText 里的searchTerm值变成了 

      \\"alert(1)}//
    • 因此,eval 最终执行的完整代码字符串是:

      var searchResultsObj = {"searchTerm":"\\";alert(1)}//"}
    • JavaScript引擎在解析这段代码时:

      • {"searchTerm":"\\": \\被解析为单个反斜杠\,紧随其后的 " 成功地闭合了字符串

      • ;alert(1): 我们的代码作为一条独立的语句被成功执行

      • //": 剩下的部分被注释掉,避免了语法错误。

(2)其他代码的分析

值得注意的是,在后面的 displaySearchResults 函数中,开发人员其实做了一些安全处理:

h1.innerText = searchResults.length + " search results for '" + searchTerm + "'";

这里使用了 .innerText 而不是 .innerHTML.innerText 会将所有内容都当作纯文本对待,不会解析HTML或执行脚本,所以这里本身是安全的

结论就是: 即使后面的DOM操作是安全的,但由于最开始数据处理时使用了 eval(),导致在数据到达安全操作之前就已经执行了恶意代码,从而引发了漏洞,因此漏洞根源在于 eval() 的滥用。

第四步:成功通关


网站公告

今日签到

点亮在社区的每一天
去签到