未受保护的API端点导致HAwebsso.nl数据泄露
背景
作为一名白天是全科医生、晚上是安全研究人员的双重身份,我的道德黑客目标之一是尽可能多地学习,以便能够审计医疗保健产品、应用程序、网站或基础设施的安全性。
今天我们将关注荷兰全科医生协会(NHG)和荷兰全科医生联盟(LHV)的安全性。这些都是荷兰全科医生的专业组织。NHG为全科医生制定标准并提供教育和培训,而LHV代表全科医生的利益,致力于提高初级保健的质量和可及性。
侦察开始
NHG和LHV都有许多在线应用程序,允许医生登录和交互。例如HAweb.nl(一个医生在线社区)和richtlijnen.nhg.org(允许医生在专业指南中添加个人笔记)。
大多数LHV和NHG应用程序共享使用域名hawebsso.nl的单点登录(SSO)认证方法。单点登录是一种认证方法,允许用户使用一组登录凭据访问多个应用程序和服务。
发现过程
登录页面引用了一个名为admin.js的JavaScript文件。查看登录页面的源代码后,发现其中一个加载的文件引起了我的注意:admin.js。
admin.js文件中的部分源代码:
|
|
有一个端点可供管理员访问,返回用户的不同角色。奇怪的是这段代码在主要登录屏幕上共享。
漏洞发现
作为拥有SSO登录的全科医生之一,我登录并访问了该端点。该端点没有正确检查请求者身份,返回了所有用户信息,包括电子邮件、全名、密码哈希和一些会员详细信息。
当我们尝试访问相同的端点并将/admin替换为ID时,发现https://hawebsso.nl/api/v1/user/15000返回了用户ID 15000的所有账户详细信息,包括密码。
在技术术语中,我们称这种错误为IDOR(不安全的直接对象引用)。端点/api/v1/user/1是一个通用端点,很容易被黑客发现。
认证缺失
在浏览器的隐身模式中打开相同的端点,没有设置cookie,我没有登录,但所有用户详细信息都被返回。答案是肯定的,此端点不需要任何登录。在技术术语中,我们现在有另一个错误:关键功能缺失身份验证。
密码哈希分析
现在我们有了密码的哈希值。使用密码哈希减少了数据泄露的影响,因为必须首先破解哈希才能检索密码。
通过将自己的密码更改为相同的密码,可以确认生成了新的唯一哈希。这给了我们一个线索,彩虹表在这里可能不起作用(例如,如果每个用户包含唯一的盐)。
测试使用的哈希值:
|
|
从侦察中知道ASP在服务器上运行,我们可能会从Microsoft提供的文档中获得更多线索。ASP.NET Core Identity版本3使用:PBKDF2 with HMAC-SHA256,128位盐,256位子密钥,10000次迭代。
结论
我们发现了一个数据泄露,泄露了荷兰全科医生使用的所有电子邮件和密码哈希。此端点未受保护,不需要任何授权。由于它是一个通用路径,很容易被黑客猜测到。
时间线
- 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年存在;这意味着错误存在了5年以上?向LHV询问对此的见解,得到回复他们将与开发人员再次确认