【问题标题】:How to protect Oauth2 implicit flow from iframe如何保护 Oauth2 隐式流免受 iframe 的影响
【发布时间】:2024-04-21 00:10:02
【问题描述】:

我正在使用 Oauth2 implicit flow 来保护单页应用程序和 Rest API。

如果您不熟悉 oauth2 隐式流程,请快速了解一下:

我们正在使用隐藏的 iframe 和小 javascript 来获取访问令牌和“刷新”(实际上是获取新令牌,只要用户登录到授权服务器)它过期时。

现在,恶意网站看起来很容易包含相同的 iframe,并且如果用户已登录,只需从哈希片段中检索访问令牌。

我查看了X-Frame-Options,它们无法阻止重定向,只能阻止呈现内部内容。但是我们的令牌在已经到达浏览器的 url 片段上。

由于这是我们“自己的”应用程序,我们跳过了用户的批准步骤,只要 redirect_uri 匹配并且用户登录,就会自动授予访问令牌。可能这个应用程序还进一步牺牲了我们的安全性。

这看起来像是一个无法接受的安全漏洞,有什么建议吗?

【问题讨论】:

  • “现在恶意网站看起来很容易包含相同的 iframe 并从哈希片段中检索访问令牌” - 这应该通过同源策略来防止.
  • 但是请求的哈希片段(这是本案例中最秘密的部分)已经到达并且可以被父窗口检索到不是吗?还是 SSL 保护这个?

标签: security iframe oauth oauth-2.0


【解决方案1】:

我也有同样的问题.. 在查看您的来源并提取您发送的参数后,恶意用户可以这样做:

        var uri = addQueryString(authorizeUri, {
            'client_id': '11',
            'redirect_uri': returnUri,
            'state': nonce,
            'scope': 'bio notes',
            'response_type': 'token',
        });

        console.log(uri);
        $('body').append(`<iframe src="${uri}"/>`);

        $('iframe').css({
            'display' : 'none'
        })

        $('iframe')[0].addEventListener("load", function () {
            var uriWithToken = $('iframe')[0].contentWindow.location.href;

            token = uriWithToken.split('access_token')[1].split("=")[1];
            expires = uriWithToken.split('expires_in')[1].split("=")[1];

            console.log(uriWithToken);
            console.log("TOKEN = " + token);
            console.log("EXPIRES = " + expires);
            $('iframe').remove();
        });

非常感谢您的令牌,我正在路上...

【讨论】:

  • 恶意用户可以窃取他们自己的令牌...哦不...除非您发现 XSS 漏洞我不明白您的意思(由于 SOP 需要 XSS)