密码自动填充与现代浏览器
在许多渗透测试报告(包括我的)中,都会报告以下内容:
启用自动填充的密码字段
页面包含一个表单,其动作URL为:
https://attacker-site.co.uk/blog-rs1/blog/autocomplete.php
该表单包含以下启用自动填充的密码字段:
password
问题背景
大多数浏览器都具有记住输入HTML表单用户凭据的功能。此功能可由用户和采用用户凭据的应用程序配置。如果启用该功能,则用户输入的凭据将存储在其本地计算机上,并在将来访问同一应用程序时由浏览器检索。
获得用户计算机控制权的攻击者可以捕获存储的凭据。此外,发现单独应用程序漏洞(如跨站脚本)的攻击者可能能够利用此漏洞检索用户的浏览器存储凭据。
问题修复
为防止浏览器存储输入HTML表单的凭据,请在FORM标签(保护所有表单字段)或相关INPUT标签(保护特定单个字段)中包含属性autocomplete="off"。
请注意,现代Web浏览器可能会忽略此指令。尽管如此,不禁用自动填充可能会导致PCI合规性问题。
现状分析
这是一个尴尬的报告问题,因为为用户保存密码是件好事。MDN对此表示:
浏览器内密码管理通常被视为对安全性的净收益。由于用户不必记住浏览器为他们存储的密码,他们能够选择比原本更强的密码。
我完全同意这一点。密码管理器(甚至是浏览器内置的)比在所有站点使用相同密码或一个密码的细微变化(monkey1Facebook、monkey1Twitter等)更好。
用户应该保护其本地设备(我指的是移动设备和桌面机器)。这意味着需要密码、PIN或指纹或等效物登录,并启用加密(如BitLocker的全盘加密,或Android加密等设备加密),以防止从文件系统中提取任何内容。
因此,浏览器为用户存储密码的风险很小。这里的主要风险是Burp漏洞描述中提到的:
跨站脚本[XSS]可能能够利用此漏洞检索用户的浏览器存储凭据。
哎呀!所以XSS可以从您的浏览器中获取凭据。要了解您的浏览器是否易受攻击,我设置了一个测试。
登录到您的密码管理器,单击以下链接,然后输入用户名:admin和密码:secretPassword,当您的浏览器要求保存密码时,请执行。开始!
然后尝试下一个预加载了此多汁XSS有效载荷的链接:
|
|
一秒延迟是为了给浏览器时间完成表单。但是,如果您的浏览器需要更长时间,可以使用delay参数更改此设置。
测试
因此,如果显示带有密码的警报框,则您的浏览器或密码管理器易受攻击。在真实攻击中不会有警报框,攻击者将密码(当然还有使用相同方法的用户名)跨域发送到他们的站点,如下所示(打开开发工具或Burp以查看后台请求)。
下一个链接已关闭自动填充。您可以在此处进行两个测试:
- 查明您的密码是否仍然从之前完成。许多现代浏览器忽略自动填充指令。
- 暂时不要进行此测试,但如果您尝试新登录(例如root和pass),请查看您的浏览器是否提示保存。
自动填充关闭
第二个测试可能会阻止您的浏览器将来在此域上自动填充任何内容,除非您手动单击(因为您现在有两个可能的站点登录)。如果您尝试了此测试,请从浏览器/管理器中删除其中一个登录。
如果您的浏览器仍然自动填充,这表明对于具有相同浏览器和密码管理器组合的用户,设置autocomplete=off是毫无意义的。
攻击者注入的表单
如果autocomplete=off对上述情况有影响,那么我文章的重点是向您展示,如果站点存在跨站脚本漏洞,并且您不幸跟随了攻击者控制的链接,攻击者注入的表单是否可以重新启用自动填充然后捕获您的凭据。
开始之前,请确保只保存一个登录。如果您尝试了上述第二个测试,请参阅以下关于如何删除密码的指南。单击此链接,然后单击您的浏览器版本并单击返回以返回此站点:如何删除密码。
这个已关闭自动填充,但是,攻击者通过XSS向量注入了自己的表单标签,并启用自动填充以尝试从中获取密码:
攻击者注入的表单
这是通过关闭HTML中的原始表单,然后在注入脚本之前打开另一个未禁用自动填充的表单来实现的:
</form><form><script...
如果此测试有效,但第二个测试无效,那么从表单中删除自动填充就像马逃跑后关上马厩门一样。密码已被保存,任何未来的XSS攻击都可以获取其密码。
Firefox 61、Edge 42和IE 11似乎易受攻击,因此如果您的站点上有跨站脚本且用户已保存密码,那么如果用户跟随了攻击者的XSS链接,攻击者可以轻松获取登录详细信息。Chrome 67似乎预填充了密码,但是,脚本警报为空,表明Chrome内置了一些巧妙的逻辑防止脚本检索它。我想知道攻击者是否有办法解决这个问题……?也许是未来文章的一个想法。
对此的解决方案是使用要求用户单击才能完成密码的密码管理器。这将阻止跨站脚本攻击自动向用户发送密码。当然,如果用户继续登录,跨站脚本可能已将事件处理程序附加到密码字段,以便在输入后发送。更改密码管理器将防范不需要进一步用户交互的完全自动化攻击。
因此,为了避免自己成为受害者:
- 如果"攻击者注入的表单"测试获取了您的密码,请切换到需要单击才能完成登录详细信息的密码管理器。
- 对于敏感站点,为登录页面添加书签,并在登录时始终跟随书签,切勿跟随来自电子邮件、其他站点或消息的链接。
从渗透测试的角度来看,似乎我们不得不报告它,特别是对于PCI测试:
不禁用自动填充可能会导致PCI合规性问题。
总之,密码管理器很棒并提高了整体安全性。但是,如果它们在未询问的情况下完成表单,就会使攻击者的工作变得容易。