分享一个在 Mozilla 的某款产品中的有趣业务逻辑漏洞。
应用的工作原理
首先,让我快速介绍一下该应用的工作原理。
Mozilla Monitor 旨在帮助用户了解数据泄露情况。用户可以使用邮箱注册该服务,以便在他们的凭据在任何已知的泄露事件中被曝光时收到提醒。它通过扫描大量泄露数据的数据库并与用户邮箱进行交叉对比,从而通知用户其信息是否被暴露。
架构
从架构上看,该应用的数据泄露信息由 haveibeenpwned.com 提供支持。在此基础上,我们的重点将转向识别和解决特定的逻辑漏洞。
主要功能 如前所述,该应用的核心功能是为监控添加电子邮件地址。在免费试用中,每个 Mozilla 账户最多可以添加五个邮箱。
例如,假设你添加了一个邮箱地址(如 [email protected]),系统会向该邮箱发送验证令牌。需要确认该令牌后,监控功能才能激活。
深入研究 Mozilla 的 Monitor 产品
我首先检查了响应中是否有任何泄露的验证令牌,但该部分的处理非常到位。接着,我尝试通过各种技巧来操纵发送到服务器的请求。例如,我尝试在同一个请求中添加多个邮箱地址,希望触发错误或发现潜在的漏洞。我还测试了竞争条件,通过在一个连接中发送多个邮箱,查看服务器是否会错误处理请求或将相同的验证令牌发送到不同的邮箱。然而,服务器再一次表现得毫无破绽。
还有一个问题!验证令牌长度太长,无法被猜测或通过暴力破解解决。例如,一个像 8034a6f3-cecd-49a4-9c43-2cf5976380a1
这样的令牌几乎不可能破解。
没有验证令牌,对我们黑客来说真是个麻烦事 :))
源代码审查
幸运的是,Mozilla 的产品是开源的。所以,我决定深入研究该产品 https://github.com/mozilla/blurts-server的开源代码,并花时间仔细审查。
我很幸运地发现了一个可以检索账户中所有添加邮箱的接口 /api/v1/user/breaches,同时还可以获取每个已验证邮箱关联的数据泄露信息。这是一个绝妙的发现!现在,让我们进一步探索它的功能,以便更好地理解。
getAllEmailsAndBreaches
函数的详细说明
通过搜索 getAllEmailsAndBreaches
函数,我发现该函数不仅检索已验证邮箱的数据,还会返回未验证邮箱的信息。
getAllEmailsAndBreaches
函数的设计目的是收集并返回与用户关联的邮箱地址及这些邮箱相关的数据泄露信息。以下是该函数的工作方式以及它在处理已验证和未验证邮箱方面的影响:
函数定义和参数
该函数接受两个参数:
user
:包含关于用户及其关联邮箱地址的信息。allBreaches
:一个从数据库中获取的数据泄露记录数组。verifiedEmails
数组将存储已确认有效的电子邮件,而 unverifiedEmails
数组则存储尚未验证的电子邮件。getUserEmails
函数,从数据库中获取与用户关联的所有电子邮件地址。需要注意的是,这可能包括已验证和未验证的电子邮件 :))verifiedEmails
数组中:monitoredEmails
。对于每个电子邮件,如果它被标记为已验证,则将其打包到 verifiedEmails
数组中。如果电子邮件未验证,则将其添加到 unverifiedEmails
数组中:验证令牌在响应中泄露
验证电子邮件端点
结论
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。
原文始发于微信公众号(白帽子左一):漏洞挖掘 | 绕过 Mozilla 的邮箱验证
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论