在一次常规的授权安全测试中,目标系统是一个标准的登录平台。在常规的登录爆破与接口未授权测试均告无效后,通过目录扫描发现了一个隐藏的密码找回功能入口。该案例揭示了逻辑设计缺陷导致的高危风险。

初步测试采用了常见的用户名密码爆破方式,但未能取得任何有效结果。

随后,通过分析前端 JavaScript代码 寻找API接口,并尝试进行未授权访问测试,但所有接口均返回401状态码,防护较为严格。

在常规路径受阻后,使用目录扫描工具进行辅助探测,意外发现了一个未被前端入口引用的密码找回页面 (/forget.html)。

该功能通常需要验证用户信息(如手机号或邮箱)。在未知真实信息的情况下,测试时输入任意内容并提交,同时使用代理工具拦截本次 HTTP请求。

关键步骤在于修改服务器的响应包。将拦截到的、验证失败时返回的响应状态码(如403)手动修改为成功状态码(200),从而欺骗前端逻辑进入下一步——密码修改页面。

在密码修改页面输入新密码并提交。此处存在核心逻辑缺陷:后端仅校验了前端是否“到达”此步骤(可能依赖于某个标记或状态),但未对第一步提交的用户验证信息进行二次校验。

请求成功发送并收到成功响应,证明任意用户密码重置漏洞存在。值得注意的是,实现此功能的API接口 (/api/user/updatePwd) 在之前的JS文件分析中并未出现,说明其可能被刻意隐藏或通过其他方式加载,这在渗透测试中值得特别关注。

漏洞原理与修复建议:
此漏洞属于业务逻辑漏洞。其根本原因在于密码重置流程的每一步之间状态验证不严谨。后端在最终修改密码时,没有复核初始发起请求的用户身份是否通过了验证。
修复方案:
- 强化状态关联:在用户开始找回流程时,生成一个唯一且不可预测的Token(如UUID)与用户账号绑定,并贯穿整个流程。每一步操作都需验证此Token的有效性及所属账号。
- 后端全程校验:关键逻辑判断完全由后端控制。在修改密码的最终接口中,后端必须重新校验验证码、安全问题答案等凭证,而不是依赖前端传递的“步骤状态”。
- 限制尝试频率:对密码找回的每一步,尤其是信息验证环节,实施严格的频率限制,防止暴力枚举。
|