oauth-state-session-bind.sh
靶子 BASE=http://localhost:20098 容器=wt_h8_tp8
【A 组 · 微信扫码链:跨会话必须被拒(用户可见判据)】
PASS A0 发起 type=3 拿到 state=4ba216e9f00670efcebf15bdc4af0287
PASS A1 jar B(全新 cookie)拿 A 的 state 打 wxcallback → 被闸拒
PASS A2 jar A 用自己的 state 打 → 过闸(守卫方向:合法流程没被误伤)
PASS A3 重放同一 state → 已被一次性消费,被拒
PASS A4 会话里有合法 state,但回调不带 state → 被拒
PASS A5 会话里有合法 state,但回调带乱 state → 被拒
【B 组 · Facebook 链:跨会话必须被拒(会话存储判据,理由见文件头)】
PASS B1 发起 type=4 后,A 的会话里有 c1_fb_oauth_state
PASS B2 jar B 拿 A 的 state 打回调后,A 的 state **仍在**(攻击者消费不掉受害者的)
PASS B3 jar B 的回调被拒 → 跳首页
PASS B4 jar A 自己打回调后,A 的 state 被消费(证明确实走到了消费那一步)
【C 组 · 微博链:同 B 组】
PASS C1 发起 type=2 后,A 的会话里有 c1_wb_oauth_state
PASS C2 jar B 拿 A 的 state 打回调后,A 的 state 仍在
PASS C3 jar A 自己打回调后,A 的 state 被消费
【D 组 · corp 级全局 state 键必须彻底消失 + 三 provider 键名不撞】
PASS D1 连发起两次授权,runtime/cache 文件数增量为 0(state 不再进企业级共享缓存)
PASS D2 同一会话依次发起 wb/wx/fb,三个 state 键同时存在(键名不互相覆盖)
【E 组 · QQ 链:state 校验失败必须**中止**(修前是校验完把结果扔了)】
PASS E1 错 state → 跳首页(修前是跳 /index.php/Login/thirdpartlogin)
PASS E2 错 state → 会话里**没有**被种下 c1_thirdlogin
PASS E3 发起 type=1 后,A 的会话里有 c1_qq_oauth_state
PASS E4 jar B 拿 A 的 state 打回调后,A 的 state 仍在
PASS E5 jar B 也没被种下 c1_thirdlogin
PASS E6 jar A 自己打回调后,A 的 state 被消费
PASS=21 FAIL=0