打开题目,有效代码为:
error_reporting(0); include("flag.php"); if(isset($_GET['r'])){ $r = $_GET['r']; mt_srand(372619038); if(intval($r)===intval(mt_rand())){ echo $flag; } }else{ highlight_file(__FILE__); echo system('cat /proc/version'); }
代码里面有两个函数:
mt_srand(seed) //播种Mersenne Twister 随机数生成器。
mt_rand() //生成随机数
mt_srand()分发seed种子,然后种子有了后,靠mt_rand()生成随机数。mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机 数。 提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数 因此不需要播种,并且如果设置了 seed参数 生成的随机数就是伪随机数,意思就是每次生成的随机数 是一样的。我们可以先用PHP跑一下生成随机数,记得加PHP标记,先生成3个随机数:
error_reporting(0); mt_srand(372619038); echo mt_rand(); echo "-"; echo mt_rand(); echo "-"; echo mt_rand();
得到随机数:1155388967-125197722-1461103528,然后我们再生成2个随机数:
error_reporting(0); mt_srand(372619038); echo mt_rand(); echo "-"; echo mt_rand();
得到随机数:1155388967-125197722,发现只要种子没变,随机数就不变,即伪随机数漏洞,我们试一下r=1155388967,得到flag。