利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

admin 2024年10月9日00:32:09评论34 views字数 2554阅读8分30秒阅读模式

 

正文

利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

目标:target.com

在子域sub1.target.com上,我发现了一个XSS漏洞。由于针对该子域的漏洞悬赏较低,我希望通过此漏洞将攻击升级至app.target.com,因为该子域的悬赏更高。

分析认证机制后,我发现:

  • sub1.target.com:使用基于Cookie的 JWT(JSON Web Token)进行认证。
  • app.target.com:使用基于Authorization头的 JWT 进行认证。

虽然两个子域的JWT值不同,但sub1.target.com的 JWT 可以在 app.target.com 上进行认证。

因此,我的思路是:通过已知的 XSS 漏洞窃取 sub1.target.com 的 JWT 令牌,从而接管用户在 app.target.com 的账户。

利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

然而,由于 sub1.target.com 的 JWT 令牌受 HttpOnly 标志保护,这使得我的想法无法实现。

HttpOnly 是一种用于增强 Web 安全性的标志(属性),它可以附加到 HTTP 响应中的 Cookie 上。启用 HttpOnly 属性的 Cookie 只能通过 HTTP(S) 请求进行访问,无法通过客户端脚本(如 JavaScript)访问。这一特性主要用于防止跨站脚本攻击(XSS)窃取敏感信息,如会话令牌(Session Tokens)或认证 Cookie。

通过进一步渗透测试,我发现该子域auth.target.com的OAuth响应中包含 JWT 令牌:

利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

从请求包中可以看到,存在一个GET参数response_mode,当我将其值从post更改为get时,响应包仍然会返回 JWT 令牌:

利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

因此,我的计划是:利用在 sub1.target.com 的 XSS 漏洞,将 auth.target.com 的 OAuth 端点加载到 iframe 中。当受害者在 iframe 中完成认证后,我便可以提取token并发送到我的服务器。

然而,浏览器通常会限制不同源(不同域名、协议或端口)之间的交互,这被称为同源策略(SOP),而两个子域名被视为不同的源,因此这个想法也行不通。

在过去,可以通过在两个子域名的 JavaScript 中显式设置 document.domain 来实现跨域访问,即在 sub1.target.comauth.target.com 中都设置 document.domain = 'target.com';。这样,它们就共享了同一个源,浏览器将允许 JavaScript 之间的交互(例如相互访问变量、调用函数等)。

然而,为了增强安全性,现代浏览器(如 Chrome)已不再支持通过 document.domain 解除同源限制的方法。

经过一番探索,当我访问以下链接时:

https://auth.target.com/oauth?client_id=redacted&redirect_uri=https://auth.target.com/endpoint.jsp&response_mode=get&response_type=code&scope=redacted&state=redacted&nonce=redacted

我被重定向到:
https://sub1.target.com#token=xxx,那么,我们就能够访问 location.href 窗口的属性并从 URL 中提取令牌。

主要的XSS Payload如下:

var auth = document.createElement('iframe');xe.setAttribute('src',' https://auth.target.com/oauth?client_id=redacted&redirect_uri=https://auth.target.com/endpoint.jsp&response_mode=get&response_type=code&scope=redacted&state=redacted&nonce=redacted');auth.setAttribute('id','linglongsec')token = new URLSearchParams(document.getElementById("linglongsec").contentWindow.location.hash.split('#')[1]).get('token');

通过 XSS 漏洞,我在 sub1.target.com 创建了一个 iframe,指向该端点:

https://auth.target.com/oauth?client_id=redacted&redirect_uri=https://auth.target.com/endpoint.jsp&response_mode=get&response_type=code&scope=redacted&state=redacted&nonce=redacted

该端点会重定向至:
https://sub1.target.com#token=xxx

简单来说,sub1.target.com 界面上新开了一个 iframe,指向
https://sub1.target.com#token=xxx

由于这两个 URL 属于同一个域,sub1.target.com 上的 XSS的 JS 脚本可以访问 https://sub1.target.com#token=xxx 的 URL 部分,而不会受到同源策略的限制。

以下语句将获取 token 值:

URLSearchParams(document.getElementById("linglongsec").contentWindow.location.hash.split('#')[1]).get('token');

最后 JavaScript 代码将token值发送到我的服务器上,实现账户接管。

这里巧妙的是Payload中response_mode的值为get而不是post

完整的攻击过程图示:

利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

原文出处:
https://7odamoo.medium.com/xss-oauth-misconfigs-token-theft-and-ato-d0837c44cd31

 

原文始发于微信公众号(玲珑安全):利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

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

发表评论

匿名网友 填写信息