跨站脚本攻击(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() 执行字符串
    • 修改srchref属性(如<script src="恶意数据">
  • 攻击流程

    1. 攻击者构造恶意URL,包含精心设计的Payload(如"><script>alert(1)</script>)。
    2. 用户访问该URL,前端JavaScript从URL的location.hashlocation.search中提取数据。
    3. 数据未经 sanitize(净化)直接插入DOM,导致脚本执行。

3. 具体示例分析
假设页面代码如下:

<script>
  const token = location.hash.slice(1);  // 从URL的hash中获取数据
  document.getElementById("display").innerHTML = "Token: " + token;
</script>
<div id="display"></div>
  • 正常URLhttps://example.com/page#12345 → 显示"Token: 12345"。
  • 恶意URLhttps://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. 防御措施

  • 输入验证与过滤
    对从locationlocalStorage等来源的数据进行严格校验,拒绝包含<script>或事件处理器的内容。
  • 输出编码
    使用textContent代替innerHTML,或对动态内容进行HTML实体编码(如将<转为&lt;)。
  • 安全API
    避免使用eval()new Function()执行动态字符串;使用setAttribute("value", data)而非直接拼接属性。
  • CSP策略
    通过Content-Security-Policy限制脚本来源,如设置script-src 'self',阻止内联脚本执行。

6. 检测与调试技巧

  • 代码审计
    全局搜索innerHTMLdocument.write等危险函数,跟踪其参数来源。
  • 动态测试
    使用浏览器开发者工具断点调试,观察数据流从来源到DOM的完整路径。
  • 自动化工具
    结合DAST(如Burp Suite)与SAST(如ESLint安全规则)工具联合检测。

总结:DOM型XSS的隐蔽性高,需深入理解前端代码逻辑才能有效防护。防御核心在于严格控制客户端数据的流动与渲染方式。

跨站脚本攻击(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,导致脚本执行。 3. 具体示例分析 假设页面代码如下: 正常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实体编码(如将 < 转为 &lt; )。 安全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的隐蔽性高,需深入理解前端代码逻辑才能有效防护。防御核心在于严格控制客户端数据的流动与渲染方式。