这个靶场是用于理解和解决“反射型 DOM XSS” (Reflected DOM XSS) 漏洞。下面是解决这个靶场的详细步骤和思路:
一、漏洞原理简介
反射型 DOM XSS 的特点是:
你的输入(Payload)会先被发送到服务器。
服务器将你的输入未经处理地“反射”回浏览器,出现在页面的 HTML 响应中。
页面上的一段 JavaScript 脚本获取了这个被反射回来的数据。
该脚本没有安全地处理这些数据,并将其传递给一个危险的“接收器”(Sink),例如
innerHTML
或document.write()
,从而导致你的恶意脚本被执行。
简单来说,这是一个结合了反射型 XSS 和 DOM-based XSS 的漏洞。
二、解决步骤
第一步:访问靶场并找到输入点
我们看到一个带有搜索功能的页面,这个搜索框就是我们的输入点。
第二步:寻找数据是如何被反射的
在搜索框中输入一个独一无二、容易识别的字符串,例如
12345
,然后点击搜索。页面刷新后,右键点击页面,选择“检查” (Inspect) 或“查看网页源代码” (View Page Source),搜索你刚刚输入的字符串
111
。
第三步:分析反射点的上下文
真正的漏洞点,也是最危险的地方,在这里:
eval('var searchResultsObj = ' + this.responseText);
这行代码是整个攻击的核心。
this.responseText
: 正如我们在Burp Suite截图中看到的,这就是从服务器返回的整个JSON字符串,例如
{"searchTerm":"111"}
eval()
函数: 这是一个极其危险的函数,它会将传入的字符串当作JavaScript代码来执行。
所以,这行代码的作用是:将服务器返回的JSON数据拼接成一个完整的JavaScript语句,然后直接执行它。
(1)攻击路径的最终确认
现在,我们可以知道我们输入双引号被转义,得到一个完整且清晰的攻击路径:
输入与反射: 您通过URL (
?search=...
) 输入Payload。服务器将其放入JSON响应中返回。服务器转义: 服务器会将您输入的双引号
"
转义成\"
。客户端接收: 浏览器中的
XMLHttpRequest
接收到这个JSON字符串 (this.responseText
)。危险的
eval
: 代码执行eval('var searchResultsObj = ' + '{"searchTerm":"您的输入被转义后的结果"}')
。注入与绕过:
我们提交的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()
的滥用。