Authentication Bypass|多步骤找回密码的信任模型错位:step1 验 A 号、step2 绑 B 号、step3 改 C 的密码

发布于 2 小时前  6 次阅读


多步骤找回密码:步骤间主体不一致 + 响应篡改

业务流程(状态机)

step1 验证手机号  →  step2 绑定手机并发送短信  →  step3 修改密码  →  step4 完成

试验矩阵

动作 结果 推出的规则
1 step1 填入找到的手机号 166xxxxxxxx 通过 step1 只校验号码存在/格式,不校验归属,也不证明"号码属于你"
2 step2 用同一号码触发短信 短信发到数据库中的绑定手机,拿不到验证码 step2 的身份来源是数据库绑定号,与 step1 的输入是两个不同概念
3 观察 step2 响应包 发现 returnkey 用于绑定会话 步骤之间靠一个客户端可观测的 state
多步骤找回密码的信任模型错位:step1 验 A 号、step2 绑 B 号、step3 改 C 的密码
原文配图(来源:local://user-case/2026-10-20-password-reset-multistep)
Authentication Bypass 评分 59.0 状态 candidate QGG-KB-20261020-014

一、核心思路

  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判
  • 来源链接: local://user-case/2026-10-20-password-reset-multistep
  • 分类命中词: {'Authentication Bypass': [], 'Account Takeover': ['账号接管'], 'Authorization Bypass': ['bfla'], 'Business Logic': ['业务逻辑']}
落到 QGG 怎么用

可直接落到 QGG 的「Authentication Bypass」测试清单:【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判;可生成部分自动化规则候选(有请求级证据)

二、成立条件

  • 来源未明确写出成立条件(缺失,需在验证阶段补齐)

三、验证方法与步骤

  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】身份来源标注:每步服务端认定的身份来自输入参数、会话 cookie、数据库、还是上一步响应?
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】步骤跳跃与乱序:直达 step3/step4、跳过 step2、重放 step1 的响应推进 step2
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】参数替换:在某一步替换主体标识(手机号/邮箱/uid),观察最终写入落在谁身上
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】响应篡改:改 success/code/step/returnkey,看服务端是否采信客户端结论
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】state token 跨主体:把 returnkey/flow_id 换到另一会话,是否跨主体生效(只读判定)
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】终态核对:改密/改绑后用'原身份'与'目标身份'分别登录,确认到底改了谁
  • 【方法模板·非来源原文】入口发现:登录/重置/SSO 回调/验证码/记住我/多因子各分支
  • 【方法模板·非来源原文】测试变量:字段省略(如 captcha 整体不传)、类型污染、大小写、注释截断、响应篡改
  • 【方法模板·非来源原文】成功证据:无凭据拿到受保护资源(带响应体)或进入他人账号
  • 【方法模板·非来源原文】误报过滤:仅 302 到首页不算;必须验证会话真的可访问受保护页面

step1 验证手机号 → step2 绑定手机并发送短信 → step3 修改密码 → step4 完成

  1. 步骤间没有"同一主体"的一致性约束:step1 校验 A、step2 绑定 B、step3 改 C 的密码。
  1. 状态机掌握在客户端:returnkey 只在请求/响应里流转,服务端未复核它绑定的主体。
  1. 前端响应被当作安全边界:篡改响应即可让前端放行并进入下一步。
  1. 服务端为整条流程维护单一主体上下文(flow_id + 绑定主体,服务端存储,客户端仅持不透明引用)。
  1. 每一步都要校验"当前请求主体 == flow 绑定主体",主体一旦确定不得中途变更。
  1. 关键结论(是否验证通过)只由服务端状态决定,不接受客户端回填。
  1. 验证码与目标号码强绑定;改密/改绑后强制失效旧会话与旧 token。

四、误报排除

  • 【来源原文片段】可在客户端修改(潜在跨主体复用面)。 - 终态核对:改密落在 step2 的号码上而非预期账号 → 证明"每步身份解析不一致"。 反向证据 / 误报排除 - "改密成功"但登录不上,不等于漏洞打通:本例最终并未接管目标账号(改的是未注册号)。 真实定级必须做终态核对:用「原身份」和「目标身份」分
反向证据

  • 可在客户端修改(潜在跨主体复用面)。 - 终态核对:改密落在 step2 的号码上而非预期账号 → 证明"每步身份解析不一致"。 反向证据 / 误报排除 - "改密成功"但登录不上,不等于漏洞打通:本例最终并未接管目标账号(改的是未注册号)。 真实定级必须做终态核对:用「原身份」和「目标身份」分

五、影响与修复

影响:

分类:Authentication Bypass;来源严重性:未提供。实际影响需以本地/授权靶场复现结果为准,评分与来源自述不构成影响结论。

修复:

统一鉴权中间件覆盖全部路由,验证码字段缺失即拒绝,禁止客户端可控的信任标记。

关联:CWE-287

六、原始来源

local://user-case/2026-10-20-password-reset-multistep



レムは信じています。 蕾姆相信 …而是你怕自己,再次辜负了雷姆爱你的心。