0%

mt_rand()漏洞

mt_srand()和mt_rand()

mt_srand()函数用于设置Mersenne Twister随机数生成器的种子值,mt_rand()函数会依据种子生成伪随机数。下面是一个示例:

mt_srand(0);
echo mt_rand().' ';
echo mt_rand().' ';
echo mt_rand().' ';

运行上述代码,会发现三个结果不一样,但是每次运行得到的结果都不变。其实是因为mt_srand(seed)中的seed是确定的,故而同次序下mt_rand()每次生成的随机数一样。

这样也就产生了漏洞:由其中一个随机数,去得到seed,然后就能预测其他随机数。

php_mt_seed

下载地址

image-20250207213933475

直接下载压缩包到kali中,然后执行下面命令即可。

tar zxvf php_mt_seed-4.0.tar.gz
make #初始化,获得一个文件php_mt_seed
chmod 777 php_mt_seed #添加权限

漏洞实例

源码:

include("seed.php");
//mt_srand(*********);
echo "Hint: ".mt_rand()."<br>";
if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){
echo "flag{0aa9ccfe-dfc6-4c0b-954d-dd55e41194db}";
}
else{
echo "No Hacker!";
} Hint: 1219893521

分析代码可知,已知一个随机数为 1219893521,如果能知道第二个随机数的值便能获得flag。

既然知道其中一个随机数了,便能利用php_mt_seed工具爆破seed,如图:

image-20250207220635329

得到不同版本php的seed,利用Wappalyzer插件获取题目中的php版本。