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
2
3
4
5
6
7
8
9
10
function ttr2_random($len, $alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
{
$alphalen = strlen($alpha) - 1;
$key = '';
for($i = 0; $i < $len; $i++)
{
$key .= $alpha[rand(0, $alphalen)];
}
return $key;
}

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 仍未闭合。

后续路线

  1. 读取 reset.php、TTR2_Form.includeTTR2_Tokens.include 的完整源码。
  2. 确认运行时 PHP 版本及 rand() 的实现/seed 行为。
  3. 先用自己的邮箱和独立 session 复现 token 流程,再研究是否存在可观测的连续输出。
  4. 对 admin token 只保留高置信候选,避免触发 WeChall 限速和 session 污染。