HAwebsso.nl未受保护API端点泄露1.5万名医生数据

荷兰医疗单点登录系统HAwebsso.nl因未受保护的API端点导致超过1.5万名医生的用户名和密码哈希值泄露,本文详细分析了IDOR漏洞的技术细节和发现过程。

未受保护的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文件。该文件包含以下源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$scope.GetAdmin = function () {
    return $http({
        method: 'GET',
        url: '/api/v1/user/admin',
    }).then(function (response) {
        $scope.adminUser = response.data;
        if ($scope.adminUser.roles != null && $scope.adminUser.roles.length > 0) {
            var roles = $scope.adminUser.roles.split(",");
            $scope.permissions = {
                admin_level_1: roles.indexOf("Admin_level_1") > -1,
                // ... 更多权限检查
            };
        }
    }).catch(function (response) {
        $scope.addMessage(response.data, response.status, response.status == 200 ? "success" : "error");
    });
}
$scope.GetAdmin();

有一个端点可供管理员调用,返回用户的不同角色。奇怪的是这段代码在主要登录屏幕上共享。

漏洞发现

作为拥有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,我没有登录。返回所有用户详细信息。

答案是肯定的。此端点不需要任何登录。在技术术语中,我们现在有另一个错误:关键功能缺少认证。

密码哈希:如何破解?

现在我们有了密码的哈希值。使用密码哈希减少了数据泄露的影响,因为必须先破解哈希才能检索密码。

通过将密码更改为与之前相同的密码,可以确认生成了新的唯一哈希。这给了我们一个线索,彩虹表在这里可能不起作用(例如,如果它们为每个用户包含唯一的盐)。

经过测试使用的哈希(不用担心,这是作者自己的哈希,使用虚拟密码):

1
em1EijmR7gmSA0NC2fbbl488pWDpX6YEfPtU4BNRsu01VX9VZFRuvSBAPaaIwVe5KC0enebMfwJC1AGZVNFbRsZ+7Pa7hj718HfKfIolp/5rDgsp/52UOqawXrNGHgwCHYsd+S0gG4K+ba3zjsjg5cVXCpIrqvlJbO45DkPqZ+B/REWhOmkBdRdie76z9oWk1qp7LFa9l/4Z3TtCgucS+m0Sl66mYcWwafRZkAas5a5z15v9iweiZK4WyEbkmUFQDgAqXMAsljftoJxSP0QN/BbXUtAm0wENIGvt7PPTg7dGxdUoySbUFpmnzm/eTeCcgbEpsJhb3bwAulMVl0F3

从我们的侦察中知道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询问对此的一些见解,得到回复他们将与开发人员再次检查。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计