跨站脚本攻击(XSS)的变异形式:基于DOM的XSS详解
字数 1695 2025-11-20 06:21:41
跨站脚本攻击(XSS)的变异形式:基于DOM的XSS详解
1. 知识点概述
基于DOM的XSS(DOM-based Cross-Site Scripting)是XSS攻击的一种特殊形式,其恶意代码执行完全在客户端完成,不依赖服务器响应内容。攻击通过修改页面的DOM结构触发,与反射型或存储型XSS相比,其检测和防御更依赖前端代码分析。
2. 攻击原理详解
-
触发条件:
前端JavaScript从攻击者可控的源(如URL参数、浏览器存储)获取数据,并通过以下危险操作动态写入DOM:innerHTML/outerHTML赋值document.write()eval()或setTimeout()执行字符串- 修改
src或href属性(如<script src="恶意数据">)
-
攻击流程:
- 攻击者构造恶意URL,包含精心设计的Payload(如
"><script>alert(1)</script>)。 - 用户访问该URL,前端JavaScript从URL的
location.hash或location.search中提取数据。 - 数据未经 sanitize(净化)直接插入DOM,导致脚本执行。
- 攻击者构造恶意URL,包含精心设计的Payload(如
3. 具体示例分析
假设页面代码如下:
<script>
const token = location.hash.slice(1); // 从URL的hash中获取数据
document.getElementById("display").innerHTML = "Token: " + token;
</script>
<div id="display"></div>
- 正常URL:
https://example.com/page#12345→ 显示"Token: 12345"。 - 恶意URL:
https://example.com/page#<img src=x onerror=alert(document.cookie)>location.hash返回#<img...>,去除#后Payload插入innerHTML。- 浏览器解析
<img>标签,触发onerror事件,窃取Cookie。
4. 与反射型/存储型XSS的区别
| 类型 | 数据来源 | 服务器是否存储Payload | 检测重点 |
|---|---|---|---|
| 反射型XSS | 请求参数(如URL、POST数据) | 否 | 服务器响应内容 |
| 存储型XSS | 数据库、服务端存储 | 是 | 服务端输出点 |
| DOM型XSS | 客户端(URL、本地存储等) | 否 | 前端JavaScript代码 |
5. 防御措施
- 输入验证与过滤:
对从location、localStorage等来源的数据进行严格校验,拒绝包含<script>或事件处理器的内容。 - 输出编码:
使用textContent代替innerHTML,或对动态内容进行HTML实体编码(如将<转为<)。 - 安全API:
避免使用eval()或new Function()执行动态字符串;使用setAttribute("value", data)而非直接拼接属性。 - CSP策略:
通过Content-Security-Policy限制脚本来源,如设置script-src 'self',阻止内联脚本执行。
6. 检测与调试技巧
- 代码审计:
全局搜索innerHTML、document.write等危险函数,跟踪其参数来源。 - 动态测试:
使用浏览器开发者工具断点调试,观察数据流从来源到DOM的完整路径。 - 自动化工具:
结合DAST(如Burp Suite)与SAST(如ESLint安全规则)工具联合检测。
总结:DOM型XSS的隐蔽性高,需深入理解前端代码逻辑才能有效防护。防御核心在于严格控制客户端数据的流动与渲染方式。