rtpsw-token
靶子 http://localhost:20098(副本 h8,容器 wt_h8_tp8)
=== A1 · 重置码是 128 bit CSPRNG token ===
PASS code 是 32 位小写 hex
PASS code 不是 4 位数字
=== A3 · 答错一次不把缓存变成永久 ===
PASS 发码后 TTL == 3600
PASS 错 token → 页面报「验证码错误」
PASS 答错后 TTL 不是 0(0 = 永久缓存)
PASS 答错后 TTL 落在 (0, 3600]
=== A4 · 错满 6 次作废该码 ===
PASS 第 7 次 → 页面报「错误次数过多」
PASS 验证码缓存已被删除
=== A5 · 验证码缓存被删之后,50 秒冷却仍然生效 ===
PASS 冷却键独立存在(未被 A4 的删除波及)
PASS 冷却期内重发被拒 —— 没有产生新的验证码缓存
=== A2 · 守卫方向:真 token 必须换得到改密页 ===
PASS 拿到新一轮的真 token
PASS 真 token 不被判为「验证码错误」
PASS 真 token 不被判为「已过期」(防「码根本没发出去」冒充通过)
PASS 渲染出改密表单(rtpsw_s3 的 csrf_token 输入框)
PASS 命中即消费:验证码缓存被清
=== A6 · Check50Scend 这条路仍然打不出信息 ===
PASS GET /Register/Check50Scend/... 不是 200
PASS 响应体不是裸的 1/0(那就是那个邮箱存在与否的答案)
=== C1 · 两个日限计数器确实在累加 ===
PASS 基线:正常发码成功
PASS 邮箱日限键被创建
PASS IP 日限键被创建
PASS 邮箱日限键 TTL == 86400(会自然过期,不是永久键)
=== C2 · 🔴 邮箱日限打满 → 被拒,且文案与成功【逐字相同】(反枚举) ===
PASS 🔴 被拒响应与成功响应逐字相同(泄露不了「这个邮箱在不在」)
PASS 🔴 真的没发出去:没有产生新的验证码缓存
=== C3 · 守卫:清掉邮箱日限键后必须立刻能发(防写成恒拒) ===
PASS 清键后再发 → 成功
PASS 并且真的产生了新的验证码缓存
=== C4 · IP 日限打满 → 据实报错(与邮箱无关,可以说) ===
PASS IP 档被拒(info==0,与邮箱档的统一文案不同)
PASS 🔴 IP 档的响应与成功响应【不同】—— 它只取决于请求方 IP,说了不泄露东西
PASS IP 档被拒时也没发出去
PASS 守卫:清掉 IP 日限键后又能发了
=== C5 · 🔴 拿不到限流锁时,这条链必须回「系统繁忙」而不是继续发码 ===
PASS 🔴 回的是失败(info==0),没有继续往下发码
PASS 🔴 真的没发出去:没有产生验证码缓存
PASS 31 FAIL 0