浅谈Dom Xss
字数 1607 2025-08-26 22:11:45
DOM型XSS漏洞深入分析与防御指南
一、DOM XSS概述
DOM型XSS(Cross-Site Scripting)是一种特殊类型的XSS攻击,其特点在于:
- 完全在客户端执行:不依赖服务器响应,仅通过浏览器DOM操作触发
- 绕过传统WAF:攻击载荷可通过location.hash等客户端参数传递,不发送到服务器
- 持久性强:可利用Cookie、localStorage等存储机制长期驻留
优势对比
- WAF绕过:通过location.hash(#后内容)或location.search(?后参数)传递payload,服务器不可见
- 长度不受限:不受URL长度限制影响
- 隐蔽性高:利用客户端存储机制,难以检测
二、常见攻击场景与技术分析
1. 跳转类漏洞
基础示例
var hash = location.hash;
if(hash){
var url = hash.substring(1);
location.href = url; // 可被#javascript:alert(1)利用
}
伪协议利用
javascript::通用JS执行协议vbscript::IE特有(如#vbscript:msgbox(IE))data::Base64编码执行(如#data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==)
防御绕过技术
案例1:indexOf检测绕过
var t = location.search.slice(1);
if(t.indexOf("url=") > -1 && t.indexOf("http") > -1){
var pos = t.indexOf("url=")+4;
url = t.slice(pos,t.length);
location.href = url;
}
绕过方法:构造?url=javascript:alert(1)//http
案例2:正则缺陷
未使用^严格匹配开头时:
// 错误的正则:/http(s)?:/
// 可被javascript:alert(1)//http://example.com绕过
2. 动态内容注入
innerHTML风险
let hash = location.hash.substr(1);
let msg = "Welcome <b>" + hash + "</b>!!";
document.getElementById("msgboard").innerHTML = msg;
风险点:直接注入未过滤的HTML内容
属性对比
| 属性 | 风险等级 | 特点 |
|---|---|---|
| innerHTML | 高危 | 解析HTML标签 |
| outerHTML | 高危 | 解析HTML标签 |
| innerText | 安全 | 自动转义HTML标签 |
3. 动态代码执行
document.write
var hash = location.hash.slice(1);
document.write(hash); // 直接写入文档流
eval危险
eval("var x = '" + location.hash + "'"); // 直接执行字符串代码
定时器风险
setTimeout(location.hash.slice(1), 100);
setInterval(location.hash.slice(1), 1000);
4. 特殊数据源
客户端存储
let payload = localStorage.getItem("payload");
document.getElementById("msgboard").innerHTML = payload;
其他敏感源
document.referrer:引用页URLwindow.name:跨页面传值postMessage:跨窗口通信
三、防御方案
1. 输入过滤
- 严格白名单:仅允许已知安全的字符集
- URL验证:完整解析URL,验证协议(仅允许http/https)
- 编码处理:
- HTML实体编码(< → <)
- JavaScript编码(" → \x22)
2. 安全API使用
- 避免直接使用
innerHTML,优先使用textContent - 禁用
eval()、setTimeout(string)等动态执行方法 - 使用
JSON.parse()替代eval()解析JSON
3. 上下文感知编码
// HTML上下文
function escapeHtml(unsafe) {
return unsafe.replace(/[&<"']/g, function(m) {
return {
'&': '&',
'<': '<',
'"': '"',
"'": '''
}[m];
});
}
// URL上下文
function safeRedirect(url) {
if(!/^https?:\/\//.test(url)) return;
location.href = url;
}
4. 内容安全策略(CSP)
Content-Security-Policy:
default-src 'none';
script-src 'self' 'unsafe-inline' https://trusted.cdn.com;
connect-src 'self';
img-src 'self' data:;
style-src 'self' 'unsafe-inline';
frame-ancestors 'none';
5. 安全开发实践
- 避免将用户输入直接插入DOM
- 使用现代框架(React/Vue)的自动转义功能
- 定期进行代码审计,重点关注:
location.hash/location.searcheval()/Function()innerHTML/outerHTML/document.write
四、测试与验证
测试用例
#javascript:alert(document.domain)#data:text/html,<script>alert(1)</script>">'-alert(1)-'
工具推荐
- DOMGoat:专门针对DOM XSS的练习平台
- Browser DevTools:调试DOM修改过程
- CSP Evaluator:检查CSP策略有效性
参考资源
- OWASP DOM XSS备忘单
- Google安全团队的DOM XSS研究论文
- 现代Web应用安全开发指南
通过全面理解DOM XSS的原理、攻击手法和防御措施,开发人员可以构建更安全的Web应用程序,有效防止这类客户端安全威胁。