0031. 通过 postMessage 接管帐户

admin 2025年3月21日00:32:59评论16 views字数 1301阅读4分20秒阅读模式
本文章仅用网络安全研究学习,请勿使用相关技术进行违法犯罪活动。
声明:本文搬运自互联网,如你是原作者,请联系我们!
标签:JS、账户接管

这篇文章是关于我如何通过一行 JavaScript 代码发现导致账户接管漏洞。目标有自己的漏洞赏金程序,因此这不是违法行为,但我仍将保密该程序的名称。

  此目标有一个主 Web 应用程序和另一个用于 OAuth 登录的域。我们将它们称为redacted.comredacted-login.com。现在,让我们回到这个bug

  当你在redacted.com上点击“登录”并选择其中一个 OAuth 提供商时,你会通过redacted-login.com API 重定向到你的 OAuth 提供商(例如 Google)的登录页面。登录后,你的 OAuth 提供商会将你重定向到redacted-login.com的回调 URL 。到目前为止一切都很好。

  在重定向到主 Web 应用之前,我们看到的最后一个页面是redacted-login.com域上的结果/成功页面。此页面postMessage中调用了一个方法。

  如果你不知道 postMessage 是什么:

  window. postmessage()方法可以安全地启用窗口对象之间的跨域通信;例如,在页面和它生成的弹出窗口之间,或者在页面和嵌入其中的iframe之间。

以下是目标的代码:

<script>try{const data = JSON.parse('{"success":true,"provider":"steam","event":"authentication","code":"none"}');const application = window.opener window.parent;application.postMessage(Object.assign({source:'auth-server'},data),'*')

  我确信您已经意识到了这个问题。

  • application变量被分配给window.openerwindow.parent。这意味着,如果我使用window.open来启动身份验证过程,我将成为父窗口。
  • 要发送的变量data包括用户的令牌。
  • 目标postMessage来源是通配符。请参阅:

  指定接收方窗口必须具有的源,以便接收事件。为了调度事件,源必须完全匹配(包括模式、主机名和端口)。如果省略,则默认为调用该方法的源。这种机制提供了对消息发送到哪里的控制;例如,如果使用postMessage()来传输密码,那么这个参数必须是一个URl,其来源与包含密码的消息的预期接收者相同,以防止恶意第三方拦截密码,这一点至关重要。也可以提供,这意味着可以将消息分派给具有任何来源的侦听器。

  我窃取令牌的方法很简单。我创建了一个包含window.open代码的 HTML 页面,然后创建一个监听器postMessage,这样就大功告成了。
PoC 页面
0031. 通过 postMessage 接管帐户
图1:PoC
以下是捕获的代码:
0031. 通过 postMessage 接管帐户
图2:捕获示例
感谢阅读。

原文始发于微信公众号(Rsec):0031. 通过 postMessage 接管帐户

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

发表评论

匿名网友 填写信息