未受保护的HAwebsso.nl API端点泄露1.5万名医生用户名和密码哈希值
背景
作者白天是全科医生,晚上是安全研究员。在道德黑客领域的目标是尽可能多地学习,以便能够审计医疗保健产品、应用程序、网站或基础设施的安全性。
今天我们将研究荷兰全科医生协会(NHG)和荷兰全科医生联盟(LHV)的安全性。这些是荷兰全科医生的专业组织。目前荷兰有1.3万名全科医生。
侦察:从哪里开始?
NHG和LHV都有许多在线应用程序,允许医生登录和交互。例如HAweb.nl(医生在线社区)和richtlijnen.nhg.org(允许医生在专业指南中添加个人笔记)。
大多数LHV和NHG应用程序共享使用hawebsso.nl域的单点登录(SSO)认证方法。
SSO系统分析
SSO是一种认证方法,允许用户使用一组登录凭据访问多个应用程序和服务。好消息是,如果我们入侵SSO,就能访问所有系统。坏消息是,大多数使用的SSO系统都是经过严格测试的软件。
通过检查OpenID端点,可以发现SSO系统保存了有趣的用户数据(在OpenID中称为声明),并支持许多不同的范围。
SSO运行在Microsoft IIS/10.0上,没有提示使用的软件。
Admin.js文件分析
登录页面引用了一个名为admin.js的JavaScript文件。该文件包含以下源代码:
|
|
有一个端点可供管理员调用,返回用户的不同角色。奇怪的是这段代码在主要登录屏幕上共享。
漏洞发现
作为拥有SSO登录的全科医生之一,作者可以登录并访问该端点。该端点没有正确检查请求者身份,返回了所有用户信息,包括电子邮件、全名、密码哈希和一些会员详细信息。
如果我们将/admin替换为ID,例如尝试访问ID 15000:https://hawebsso.nl/api/v1/user/15000
用户ID 15000存在,所有账户详细信息都与我们共享,包括密码。
我们现在已经展示了此端点的影响:它泄露了在SSO服务hawebsso.nl注册的所有用户的详细信息。
技术细节
在技术术语中,我们称这种错误为IDOR(不安全的直接对象引用)。
端点/api/v1/user/1是一个通用端点,可以很容易地被黑客发现。可以使用单词列表在此类资产上暴力破解端点。
黑客可以采取的另一种方法是扫描所有使用的JavaScript文件以查找端点。例如LinkFinder可以为您完成此操作。
无需认证
我们现在已经证明特定端点泄露了用户详细信息,但是它需要认证吗?可以在未登录的情况下访问此端点吗?
在浏览器的隐身模式中打开相同的端点。没有设置cookie,我没有登录。返回所有用户详细信息。
答案是肯定的。此端点不需要任何登录。在技术术语中,我们现在有另一个错误:关键功能缺少认证。
密码哈希:如何破解?
现在我们有了密码的哈希值。使用密码哈希减少了数据泄露的影响,因为必须先破解哈希才能检索密码。
通过将密码更改为与之前相同的密码,可以确认生成了新的唯一哈希。这给了我们一个线索,彩虹表在这里可能不起作用(例如,如果它们为每个用户包含唯一的盐)。
经过测试使用的哈希(不用担心,这是作者自己的哈希,使用虚拟密码):
|
|
从我们的侦察中知道ASP在服务器上运行,我们可能会从Microsoft提供的文档中获得更多线索:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity
后来发现了这篇(5年前)关于不同哈希算法的博客https://andrewlock.net/exploring-the-asp-net-core-identity-passwordhasher/,并发现了以下有趣的部分:
ASP.NET Core Identity版本3:PBKDF2 with HMAC-SHA256,128位盐,256位子密钥,10000次迭代
这给了我一个提示,ASP开箱即用地使用了适当的哈希算法,这是我现在无法轻易破解的算法。
结论
我们发现了一个数据泄露,泄露了荷兰全科医生使用的所有电子邮件和密码哈希值。此端点未受保护,不需要任何授权。由于它是通用路径,黑客可以轻松猜到。此外,对此端点的引用隐藏在登录页面包含的admin.js文件中,像LinkFinder这样的工具会通知任何扫描黑客此特定端点。
时间线
- 2022年12月4日 - 发现错误,通过电子邮件向LHV隐私官报告
- 2022年12月5日 - 隐私官回复确认错误
- 2022年12月6日 - 隐私官更新
- 2022年12月8日 - 隐私官更新:错误存在3年(自2019年底以来),过去2年的日志中没有滥用迹象
- 2022年12月11日 - 撰写此博客
- 2022年12月12日 - 通过电子邮件将博客草稿发送给隐私官
- 2022年12月12日 - LHV和NHG通过电子邮件通知所有会员数据泄露;要求会员重置密码
- 2022年12月13日 - LHV建议一些微小更改
- 2022年12月14日 - 发布博客
- 2022年12月15日 - 读者告知Admin.js文件存在于2017年;https://web.archive.org/web/20170905141113/https://hawebsso.nl/Js/admin/admin.js 这是否意味着错误存在了+5年?向LHV询问对此的一些见解,得到回复他们将与开发人员再次检查。