关键漏洞信息 漏洞描述 The mall-portal password reset flow allows an unauthenticated attacker to reset any user's password using only the victim's telephone number. 严重性 Critical (Account Takeover) OWASP Top 10 A01:2021 - Broken Access Control A07:2021 - Identification & Authentication Failures 影响组件 Module: mall-portal Controller: com.macro.mall.portal.controller.UmsMemberController Endpoints: - - 根因分析 1. Controller is mounted under /sso - 文件: mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java - 使得 UmsMemberController 所有端点公开 2. OTP is returned directly to the requester - 文件: mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java - OTP 通过 API 响应直接返回给请求者 3. OTP generation stores code by telephone and returns it - 文件: mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java - OTP 由 方法生成和存储 4. Password reset only checks OTP equality against Redis value - 文件: mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java - 密码重置仅检查 OTP 是否与 Redis 中的值相等 攻击场景(无需认证账户接管) 1. 攻击者知道/猜测受害者的电话号码。 2. 攻击者请求 OTP 并在响应中收到: - 3. 攻击者使用返回的 OTP 重置密码: - with 4. 攻击者以受害者身份登录。 结果: 完全账户接管,无需认证或电话/SMS 占有。 影响 任何绑定到电话号码的账户无需认证即可重置密码 / 账户接管。 OTP 过期/时间限制不能缓解问题,因为 OTP 直接披露给请求者。 如果可以枚举电话号码,则可能大规模妥协。 推荐修复方案 1. 不要在 API 响应中返回 OTP/authCode。通过带外方式发送 OTP (SMS/电子邮件)。 2. 在 和 上添加速率限制 (按 IP + 每个电话),再加上反复失败的锁定机制。 3. 使用SecureRandom (而不是 ) 进行 OTP 生成。 4. 强制执行一次性使用:重置成功后使 OTP 失效/删除。 5. 通过返回通用响应来减少枚举 (例如,"如果账户存在,则发送一个代码")。 附加说明 即使移除 OTP 泄漏问题后,当前仍使用 生成 6 位数的 OTP,因此仍推荐速率限制和 以降低暴力破解和可预测性风险。