浅谈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等存储机制长期驻留

优势对比

  1. WAF绕过:通过location.hash(#后内容)或location.search(?后参数)传递payload,服务器不可见
  2. 长度不受限:不受URL长度限制影响
  3. 隐蔽性高:利用客户端存储机制,难以检测

二、常见攻击场景与技术分析

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:引用页URL
  • window.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 {
            '&': '&amp;',
            '<': '&lt;',
            '"': '&quot;',
            "'": '&#39;'
        }[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. 安全开发实践

  1. 避免将用户输入直接插入DOM
  2. 使用现代框架(React/Vue)的自动转义功能
  3. 定期进行代码审计,重点关注:
    • location.hash/location.search
    • eval()/Function()
    • innerHTML/outerHTML/document.write

四、测试与验证

测试用例

  1. #javascript:alert(document.domain)
  2. #data:text/html,<script>alert(1)</script>
  3. ">
  4. '-alert(1)-'

工具推荐

  1. DOMGoat:专门针对DOM XSS的练习平台
  2. Browser DevTools:调试DOM修改过程
  3. CSP Evaluator:检查CSP策略有效性

参考资源

  1. OWASP DOM XSS备忘单
  2. Google安全团队的DOM XSS研究论文
  3. 现代Web应用安全开发指南

通过全面理解DOM XSS的原理、攻击手法和防御措施,开发人员可以构建更安全的Web应用程序,有效防止这类客户端安全威胁。

DOM型XSS漏洞深入分析与防御指南 一、DOM XSS概述 DOM型XSS(Cross-Site Scripting)是一种特殊类型的XSS攻击,其特点在于: 完全在客户端执行 :不依赖服务器响应,仅通过浏览器DOM操作触发 绕过传统WAF :攻击载荷可通过location.hash等客户端参数传递,不发送到服务器 持久性强 :可利用Cookie、localStorage等存储机制长期驻留 优势对比 WAF绕过 :通过location.hash(#后内容)或location.search(?后参数)传递payload,服务器不可见 长度不受限 :不受URL长度限制影响 隐蔽性高 :利用客户端存储机制,难以检测 二、常见攻击场景与技术分析 1. 跳转类漏洞 基础示例 伪协议利用 javascript: :通用JS执行协议 vbscript: :IE特有(如 #vbscript:msgbox(IE) ) data: :Base64编码执行(如 #data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== ) 防御绕过技术 案例1:indexOf检测绕过 绕过方法 :构造 ?url=javascript:alert(1)//http 案例2:正则缺陷 未使用 ^ 严格匹配开头时: 2. 动态内容注入 innerHTML风险 风险点 :直接注入未过滤的HTML内容 属性对比 | 属性 | 风险等级 | 特点 | |------|---------|------| | innerHTML | 高危 | 解析HTML标签 | | outerHTML | 高危 | 解析HTML标签 | | innerText | 安全 | 自动转义HTML标签 | 3. 动态代码执行 document.write eval危险 定时器风险 4. 特殊数据源 客户端存储 其他敏感源 document.referrer :引用页URL window.name :跨页面传值 postMessage :跨窗口通信 三、防御方案 1. 输入过滤 严格白名单 :仅允许已知安全的字符集 URL验证 :完整解析URL,验证协议(仅允许http/https) 编码处理 : HTML实体编码( < → &lt;) JavaScript编码(" → \x22) 2. 安全API使用 避免直接使用 innerHTML ,优先使用 textContent 禁用 eval() 、 setTimeout(string) 等动态执行方法 使用 JSON.parse() 替代 eval() 解析JSON 3. 上下文感知编码 4. 内容安全策略(CSP) 5. 安全开发实践 避免将用户输入直接插入DOM 使用现代框架(React/Vue)的自动转义功能 定期进行代码审计,重点关注: location.hash/location.search eval()/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应用程序,有效防止这类客户端安全威胁。