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