知识点:在面对php_srand()中种子数不确定的情况,可以使用工具php_mt_seed进行破解
一、先下载php_mt_seed
地址:php_mt_seed - PHP mt_rand() seed cracker --- php_mt_seed - PHP mt_rand() 种子饼干 (openwall.com)
1、下载压缩包
2、将压缩包上传到虚拟机上进行解压
命令:tar -zxvf php_mt_seed-4.0.tar.gz,进入解压出来的文件夹输入./php_mt_seed.c
提示权限不足则输入命令:chmod 777 php_mt_seed.c 赋予权限
2、传入参数r=0获得第一次产生的序列数,以此通过脚本来倒推seed
通过代码$rand=intval($r)-intval(mt_rand())分析
我们可以通过让intval($r)=0 让$rand不为0不满足if条件输出rand的值,同时可以获得mt_rand()第一次产生的随机数值的负数形式
3、使用脚本反推seed
先在目录先输入命令make 再输入time ./php_mt_seed 上面的序列数
一个一个选择,根据php的版本进行选择,这里先选择4049114582
已知seed为4049114582,根据代码分析,要输出flag需要cookie中的token值等于第二次和 第三次mt_rand()之和,通过下面的脚步代码算出token
<?php mt_srand(4049114582); mt_rand(); $token = mt_rand()+mt_rand(); echo $token; ?>
算出token:1647864971