这篇文章是关于我如何通过一行 JavaScript 代码发现导致账户接管漏洞。目标有自己的漏洞赏金程序,因此这不是违法行为,但我仍将保密该程序的名称。
此目标有一个主 Web 应用程序和另一个用于 OAuth 登录的域。我们将它们称为redacted.com和redacted-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.opener或
window.parent
。这意味着,如果我使用window.open
来启动身份验证过程,我将成为父窗口。 - 要发送的变量
data
包括用户的令牌。 - 目标
postMessage
来源是通配符。请参阅:
指定接收方窗口必须具有的源,以便接收事件。为了调度事件,源必须完全匹配(包括模式、主机名和端口)。如果省略,则默认为调用该方法的源。这种机制提供了对消息发送到哪里的控制;例如,如果使用postMessage()来传输密码,那么这个参数必须是一个URl,其来源与包含密码的消息的预期接收者相同,以防止恶意第三方拦截密码,这一点至关重要。也可以提供,这意味着可以将消息分派给具有任何来源的侦听器。
window.open
代码的 HTML 页面,然后创建一个监听器postMessage
,这样就大功告成了。原文始发于微信公众号(Rsec):0031. 通过 postMessage 接管帐户
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论