去年,Nagli 在 ChatGPT 中发现了一个网络缓存欺骗漏洞,其影响至关重要,因为它导致用户的身份验证令牌泄露,并可导致任意帐户被接管。
OpenAI 立即向 ChatGPT 用户通报了该漏洞,并迅速修复了该漏洞……
在本篇文章中,国外研究人员将解释如何滥用路径遍历 URL 解析器来实现 “通配符 “缓存欺骗漏洞,从而窃取用户授权令牌并接管他们的账户。
假设你已了解 Web 缓存欺骗漏洞的基础知识,本文不再做过多解释。如果你还不熟悉这些知识,或是想复习一下这快知识,可以先阅读 Nagli 的文章,然后再回到本文。另外,该漏洞使用了与2022年 Glassdoor 中发现的 Web 缓存中毒漏洞类似的概念,该漏洞允许我们缓存“不可缓存”的文件和端点,虽然这不是完全相同的技术,但它展示了 URL 解析器混乱的可能性,特别是路径遍历,为各种缓存漏洞打开了新的大门。
在使用 ChatGPT 新实现的“分享”功能时,安全人员注意到一些奇怪的事情,当继续与 ChatGPT 交谈时,共享聊天链接都不会更新。
安全人员猜测共享聊天可能被缓存,因此在缓存条目消失之前都不会进行更新。
为了测试这一点,安全人员在开发工具中打开了网络选项卡来检查响应标头,正如所预测的,可以明显看到 Cf-Cache-Status: HIT
标头。这非常有趣,因为这不是静态文件,通过检查 URL,发现该路径没有预期的静态扩展名:
https://chat.openai.com/share/CHAT-UUID
这就意味可能有一个缓存规则并不依赖于文件的扩展名,而是依赖于它在 URL 路径中的位置,为了测试这一点,安全人员检查了 https://chat.openai.com/share/random-path-that-does-not-exist
不出所料,它同样也被缓存了。安全人员发现缓存规则是这样的 /share/*
,/share
/ 路径下的几乎所有内容都会被缓存,这立刻引起了安全人员的警觉,因为放宽缓存规则可能会非常危险,尤其是在 URL 解析器混乱的情况下。
在使用缓存的网站中,请求在到达 Web 服务器之前必须经过 CDN,这就意味着 URL 会被解析两次,这可能会导致 URL 解析器混乱。
在 ChatGPT 的案例中,URL 解析器混乱意味着两个服务器以不同的方式解析 URL 编码的正斜杠,其中 Cloudflare 的 CDN 不会解码,也不会规范化 URL 编码的路径遍历,但 Web 服务器会这样做。
因此,URL 编码的路径遍历允许攻击者从服务器缓存他们想要的任何文件,包括影响最大的包含授权令牌的 API 端点。下面是一个示例Payload:请注意, %2F
解码为 /
和 /api/auth/session
是一个敏感的 API 端点,其中包含用户的身份验证令牌 https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123
那么让我们来分析一下。
- 我们已经确定 CDN 将缓存
/share/
下的所有内容 - CDN 不会解码也不会标准化
%2F..%2F
,因此,响应将被缓存 - 但是,当 CDN 转发此 URL 时,Web 服务器将解码并标准化
%2F..%2F
,并使用包含身份验证令牌的/api/auth/session
进行响应
综上所述,当受害者访问 https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 时,他们的身份验证令牌将被缓存,当攻击者稍后访问 https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 时,他们将看到受害者缓存的身份验证令牌。所以,一旦攻击者获得了身份验证令牌,他们就可以接管该帐户、查看聊天记录、账单信息等。
以下是安全人员画的草图,以方便更直观理解:
总之,由于 CDN 和 Web 服务器之间的路径规范化不一致,从而能够使用 URL 编码路径来遍历缓存敏感信息的 API 端点。
最终该安全人员获得了OpenAI发放的 6500 美元赏金奖励。