0x00 rand()函数

rand()的随机数默认最大32767,可以用于爆破这里不再举例。

0x01 mt_rand()和mt_srand()函数

mt_srand()函数用于播种,PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,当PHP版本到了5.2.1后,通过修改算法修补了奇数和偶数的播种相等的问题,这样也导致了php5.2.0前后导致同一个播种后的mt_rand()的值不一样
5.2.6>php>4.2.0默认播种的算法也不是很强悍,当目标>5.20时候,我们exp运行的环境也要是>5.20的版本,mt_rand处理的数据都是不安全的。在web应用里很多都使用mt_rand来处理随机的session,比如密码找回功能等等。
如果你知道一个mt_rand()的值就可以,就可以推断出mt_srand()的种子值,从而推断出下一个mt_rand()值。
工具:http://download.openwall.net/pub/projects/php_mt_seed/php_mt_seed-3.2.tar.gz

root@kali:~# php5 -r ‘mt_srand(123123123); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
1474031914

root@kali:~/php_mt_seed-3.2# ./php_mt_seed 519979806
Found 0, trying 100663296 - 134217727, speed 34831590 seeds per second
seed = 123123123
Found 1, trying 1509949440 - 1543503871, speed 34497359 seeds per second
seed = 1525862101
Found 2, trying 3992977408 - 4026531839, speed 34601190 seeds per second
seed = 3994356879
Found 3, trying 4261412864 - 4294967295, speed 34578163 seeds per second
Found 3

可见程序给出了三个种子,逐个测试即可:
root@kali:~# php5 -r ‘mt_srand(1525862101); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
14803299
root@kali:~# php5 -r ‘mt_srand(3994356879); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
978260809

123123123为真正的种子,这样就可以轻松拿到真正的种子,下一个要产生的随机数也就知道了