WeChall - Time to Reset II
Challenge
URL:
https://www.wechall.net/en/challenge/time_to_reset2/index.php
这是 Time to Reset 的续作,要求提交当前 session 下、用户
admin@wechall.net 的 password reset token。题面提供
highlighted source,并明确提示 token 绑定 session。
已确认源码
从 index.php?show=source 取得的当前源码中,token
生成函数是:
1 | function ttr2_random($len, $alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') |
reset 请求流程为:
- 从当前 session 取得
$sid; - 从表单取得 email;
- 生成 16 字符 token;
- 通过
TTR2_Tokens::insertToken($sid, $email, $token)写入数据库; - 只有当 email 等于当前用户真实邮箱时,服务器才会把 token 发给当前用户。
源码中还保留了被注释掉的旧思路:srand(time()+rand(0, 100))
和用 ttr2_random(32) 生成 CSRF。这说明题目确实围绕 PRNG
预测,但当前 token 生成使用的是 PHP rand()
的运行时状态。
现有线索
旧 draft 记录过论坛中“每个 symbol 有 50% 概率预测正确,另外 50% 会差 1”的线索。该描述尚未由当前 live 流程复现,暂时只能作为历史 clue,不能当作算法结论。
当前状态
未解决。没有继续请求 admin reset,也没有提交猜测 token。token 生成、session 绑定和邮件条件已经确认,但 PHP 版本、PRNG 状态初始化及可观测 oracle 仍未闭合。
后续路线
- 读取 reset.php、
TTR2_Form.include和TTR2_Tokens.include的完整源码。 - 确认运行时 PHP 版本及
rand()的实现/seed 行为。 - 先用自己的邮箱和独立 session 复现 token 流程,再研究是否存在可观测的连续输出。
- 对 admin token 只保留高置信候选,避免触发 WeChall 限速和 session 污染。