一、实验目的
- 理解 DOM 型 XSS 的基本原理与特点。
- 掌握在 DVWA 平台中对 DOM XSS 漏洞的发现方法。
- 学会在受控环境下对 DOM XSS 进行验证与利用。
- 分析不同安全等级下 DVWA 对 DOM XSS 的防护差异。
- 掌握 DOM XSS 的基本修复与防御思路。
二、实验原理
- 什么是 DOM 型 XSS
DOM 型 XSS(Document Object Model Based XSS)是一种客户端脚本注入漏洞。其特点是:恶意输入通常不会经过服务器端处理后返回;漏洞发生在浏览器端 JavaScript 对页面 DOM 的操作过程中。
常见危险来源:
- document.location
- location.href
- location.search
- location.hash
- document.URL
- document.referrer
常见危险接收点:
- document.write()
- innerHTML
- outerHTML
- eval()
- setTimeout() / setInterval()
- srcdoc
- DOM XSS 与其他 XSS 的区别
|-----------|----------------------------|
| 类型 | 特点 |
| 反射型 XSS | 恶意输入由服务器即时返回到页面 |
| 存储型 XSS | 恶意输入被存储到数据库,再展示给用户 |
| DOM 型 XSS | 注入和执行发生在浏览器端,往往与前端 JS 代码有关 |
- DVWA 中 DOM XSS 的典型原理
在 DVWA 的 DOM XSS 模块中,页面通常会读取 URL 参数中的值,例如:document.location.href,然后通过不安全方式写回页面,例如:document.write(...)。如果开发者没有对输入进行有效过滤和安全编码,就可能造成脚本执行。
三、实验前置准备
实验前需完成以下配置:
-
- DVWA 已正确部署并可正常登录 DVWA;
- 浏览器允许 JavaScript 正常执行;
四**、实验步骤及结果**
步骤 1:Low 级别 DOM XSS
进入DVWA平台后,在 DVWA Security 中将安全级别设置为 Low,然后进入XSS (DOM) 功能页面。页面通常会出现一个语言选择框或 URL 参数控制内容的功能。尝试选择某个语言选项后点击提交:观察地址栏是否出现类似参数:...?default=English
这表明前端脚本可能正在使用 URL 中的 default 参数。
由于参数内容可能被插入到 <option> 标签中,直接输入 <script> 有时不一定能触发。通常可采用闭合原有标签后插入新标签的方式。
可使用如下测试语句:English</option></select><script>alert(1)</script>
拼接测试 URL,提交后观察页面变化,保存截图并分析结果。


结果分析
拼接 URL 访问,页面成功弹出 alert,漏洞触发。
结果分析:Low 级别无任何防护,直接将参数拼接到 DOM 中,可直接执行脚本。
步骤 2:Medium 级别 DOM XSS
将 DVWA 安全等级设为:Medium
测试绕过思路:尝试插入带事件的 HTML 标签 ,保存截图并分析结果。

Payload 成功触发的验证
构造的 Payload:
?default=English</option></select><img src=x onerror="alert('DOM XSS')">
访问该 URL 后,页面成功弹出 DOM XSS 提示框,说明注入的 JavaScript 代码已被浏览器解析并执行,DOM XSS 漏洞在 Medium 级别下可被成功利用。
结果分析
- 页面通过 JavaScript 读取 URL 中 default 参数的值,并直接拼接到页面的 <select> 下拉框 DOM 中,未对用户可控数据进行安全编码或过滤。
- Payload 中 English</option></select> 先闭合了原有的下拉框标签,使后续注入的 <img> 标签能被浏览器正常解析。
- <img src=x onerror="alert('DOM XSS')"> 中,src=x 会触发图片加载错误,进而触发 onerror 事件,执行 alert() 脚本,实现 XSS 攻击。
步骤 3:High 级别 DOM XSS
将 DVWA 安全等级设为:High
分别尝试直接输入脚本 、和带事件的 HTML 标签。
再测试:#default=<script>alert(1)</script> , 提交后观察页面变化,保存截图并分析结果。

结果分析:
High 级别后端对 URL 中 ? 后的 default 参数做了严格的白名单校验,仅允许预设的语言值(English/French/Spanish/German),非白名单内容会被直接过滤,因此常规注入全部失效。
成功版 (#default=<script>alert(1)</script>)

结果分析
- 访问该 URL 后,页面成功弹出alert(1)提示框,说明脚本已被浏览器解析并执行。
- 地址栏的 URL 中,#后的内容未发送到服务器,因此绕过后端的白名单过滤;而前端 JavaScript 会读取 Hash 中的default参数值,并直接写入页面 DOM 中,导致恶意脚本被执行。
步骤 4:DOM XSS 常见利用方式(LOW级别)
1. 窃取 Cookie(最常用)
测试payload:
default=<script>alert(document.cookie)</script>
提交后观察页面变化,保存截图并分析结果。

结果与分析
- 现象:页面弹出包含当前会话 Cookie 的提示框,内容类似 security=low; PHPSESSID=xxxxxx。
- 原理:document.cookie 可以读取当前页面的 Cookie 信息,XSS 脚本执行后,通过 alert() 将 Cookie 显示出来。
- 危害:攻击者可以将窃取到的 Cookie 发送到自己的服务器,实现会话劫持,登录受害者的账户。
2. 跳转到钓鱼页面
测试payload:
default=<script>location.href='http://www,b'</script>
提交后观察页面变化,保存截图并分析结果。

测试 Payload
?default=<script>location.href='https://www.baidu.com'</script>
操作步骤
保持安全等级为 Low,在地址栏构造完整 URL:
http://127.0.0.1:8888/dvwa/vulnerabilities/xss_d/?default=\<script>location.href='https://www.baidu.com'</script>
结果与分析
- 现象:页面自动跳转到 Payload 中指定的 URL(如百度首页)。
- 原理:location.href 可以修改当前页面的跳转地址,脚本执行后,浏览器会直接加载目标 URL。
- 危害:攻击者可以将用户跳转到仿冒的钓鱼页面,诱导用户输入账号密码,从而窃取用户信息。
3. 获取页面源码
测试payload:
default=<script>alert(document.documentElement.outerHTML)</script>
提交后观察页面变化,保存截图并分析结果。
结果与分析
- 现象:页面弹出包含当前页面完整 HTML 源码的提示框。
- 原理:document.documentElement.outerHTML 可以获取当前页面根元素(<html>)的所有 HTML 代码,包括页面结构、隐藏元素和部分前端敏感信息。
- 危害:攻击者可以通过获取页面源码,分析页面逻辑、接口路径或隐藏的敏感信息,为进一步攻击做准备。
五、实验小结
防御要点:
- 避免使用document.write、innerHTML直接插入用户可控数据;
- 对 URL 参数、hash 值做HTML 编码与 JS 编码;
- 白名单限制可控内容,禁止执行未知脚本。