从注册号枚举到拒绝服务:链式利用IDOR与OTP绕过的预约系统漏洞分析
大家好,
最近我在测试一个面向医生和医疗专业人员的政府网站时,发现了一系列安全漏洞。该平台允许用户管理注册信息、预约时段、申请良民证或无异议证书、更新执照以及提交证明文件。简而言之,它负责处理该州医疗从业者的完整许可、验证和认证流程。
在测试网站过程中,我注意到了一个时段预约端点,其中的几条规则引起了我的关注。
用户每30天只能预约一次时段。我首先想到的是,如果我能以他人名义预约时段,该用户将在接下来的30天内无法进行预约。
预约流程包含四个步骤:选择日期、选择服务、提供注册号,以及验证手机号完成注册。
我首先按日期检查时段可用性,然后依次按时段类型、时段期间和具体时间进行筛选。之后选择需要预约的服务。
接着,进入医生资料环节,需要提供注册证书上的注册号,界面如下所示。
没有注册号就无法预约时段,这似乎是个死胡同。但我决定至少尝试五次。
注册号下方的示例引起了我的注意。于是,我随机输入了"ABC12345"(实际学院名替代了ABC),随后医生姓名字段竟自动填充了。我完全没料到这会成功,第一次尝试就获取了正确的注册号。
我检查了Burp历史记录,查看响应中是否存在个人信息泄露。
这个端点通过注册号获取医生姓名,而在响应中我还看到了手机号码。通过递增和递减注册号,我发现了大量医生姓名和手机号。响应中没有其他信息泄露。
至此,我已获得注册号、医生姓名和手机号。在用户界面中,并没有强制要求手机号必须是医生本人的。而验证用的OTP正是发送到这个号码。我面临另一个挑战:需要提供医生手机号或任意随机号码。为此,我必须绕过OTP验证。
首先,我需要确认OTP是4位还是6位数。使用自己的手机号后,发现是6位数。暴力破解6位代码需要时间,因此我决定先测试网站在OTP错误时的响应。我输入了一个随机手机号和"000000"作为OTP。
随后,我在Burp中拦截了响应。
响应中返回了"false",我将其改为"true"并转发请求,操作成功了。通过响应篡改,我成功绕过了OTP验证。
如果我们提供了医生的真实手机号,医生本应会收到确认消息。但由于我们提供了随机号码并绕过了验证,如果该号码存在,他们也会收到消息。基本上,医生无法得知是否有人以其名义预约了时段。而如果他们自己尝试预约,将在未来30天内无法操作,从而导致拒绝服务情况。
我还发现了一个通过姓名和注册号搜索医疗注册信息的端点。通过注册号搜索,我获得了这些信息。
结论
这些漏洞组合允许攻击者枚举注册号、获取关联的医生姓名和手机号,并通过响应篡改绕过OTP验证。这使得攻击者能够以医生名义进行未授权预约,并可能阻止医生在30天内进行合法预约,实质上构成了针对特定账户的定向拒绝服务攻击。