近期我向Google报告了一个安全问题,这个漏洞将允许攻击者确认某Web页面的访问者是否登录了任意一个Google服务的账号(包括GSuite账号在内)。
根据我的测试结果,攻击者可以在每25秒钟的时间里确认大约1000个电子邮箱账号。但是Google方面给出的回复是:这是一个专门设计的功能,它并非是一个安全漏洞。
你可以在这个【演示页面】自行测试该功(lou)能(dong)。
首先给大家先上一个PoC演示动图(测试账号是我自己的邮箱):
方法论
我之前曾经写过一篇关于“识别用户是否登录了某个社交网络”的文章,而本文所描述的攻击方式正是之前技术的变种版本。不过恕我直言,本文将要介绍的攻击方法影响会更加的严重。
Google的登录页面通常会在URL链接中传递一个continue参数,这个参数将负责把用户重定向到他们完成登录后原本需要访问的目的地址。但是如果你已经完成的登录的话,你将会立刻被重定向到continue参数所定义的URL地址。
这样一来,攻击者就可以利用这种运行机制并通过一个专门制作的URL地址来将已登录的用户重定向到一个图片文件,并呈现一个伪造的登录页面来尝试欺骗用户完成登录操作。如果你现在在img标签的src属性中使用这种URl地址的话,你就可以使用JavaScript的onload和onerror函数来确定图片是否已经正确加载了。
如果图片成功加载,说明用户完成了登录操作;如果图片加载出现错误,则说明用户没有登录。这个问题其实Google早就已经知道了,不过这种功能也有一定的局限性,并且无法造成严重的影响,所以Google并没有理会。
但是这个问题并不是Google想象的那么简单,因为攻击者现在还可以提供一个额外的参数来指定一个电子邮件地址。这也就意味着,如果攻击者提供的电子邮件地址能够与目标用户的邮件地址相匹配,则会触发一次重定向。
这样一来,攻击者就可以通过JavaScript的onload属性来动态创建并加载一个图片标签(这个过程不需要将图片对象添加到Web页面,而且你甚至都不需要将其附加到页面的DOM树中),然后等待匹配完成即可。在我的测试过程中,我可以每23-24秒的时间里检测大约1000个电子邮箱地址。如果目标用户登录了你的网站并停留了几分钟的话,你就可以检测好几千个邮箱地址了。
但是现在我们需要配合一些其他的方法来收集目标用户的部分基本信息,例如通过IP地址来了解到他们的地理位置,使用有针对性的社交广告来收集关于他们企业网络或其他的一些基本信息等等。如果顺利的话,你现在应该已经能够动态加载一份目标地址列表了。接下来,你就可以通过本文所介绍的技术来匹配并记录下目标用户的邮箱地址、IP地址、地理位置、设备信息以及其他各种各样的信息了。
现在,你就可以利用刚才所收集到的信息来发动动态网络钓鱼攻击了。
漏洞披露时间轴
- 2017年7月14日:我将这个问题报告给了Google的安全团队;
- 2017年7月17日:该问题已被分类,并等待处理结果;
- 2017年7月18日:Google安全团队与我联系,并询问我关于处理该漏洞的建议;
- 2017年7月18日:我给他们的建议是,在电子邮件中采用某种随机数或加盐哈希,并且只有在哈希和邮件相匹配的情况下才允许进行重定向;
- 2017年7月19日:Google确认将该问题归类为安全漏洞;
- 2017年7月21日:我发布了一篇文章对该漏洞进行了详细描述;
- 2017年8月9日:Google团队在经过讨论之后,告诉我这是一个专门设计的功能,并表示不会将其视为一个安全问题,因此他们不会采取任何下一步操作;
总结
这种攻击技术的确有一定的局限性,因为你必须事先获得一份目标用户列表。虽然Google安全团队并不认为这是一个安全漏洞,但是我仍然非常感谢他们,感谢他们能够对我提交的信息及时回复,他们非常的友好。