简介
php伪随机漏洞由于 mt_srand(seed) 函数和 mt_rand() 函数产生。
在执行 mt_rand() 函数生成随机数之前,先要执行 mt_srand(seed) 函数分发种子,使 mt_rand() 函数能够生成随机数,但是此处生成的随机数实际上是伪随机的。
由例子来引入
<?php
// 要注意该函数生成的伪随机数在不同的 php 版本下是不同的,分界线版本是 7.0.+
// 下面我们以 7.0.+ 以上版本为例
mt_srand(123); // 填入种子
echo mt_rand(); // 输出结果 1495656191
echo mt_rand(); // 输出结果 1531059894
?>
乍一看好像没啥问题,但你可以试试创建一个新的php文件,然后写进如上的相同代码(包括其他方法,不管怎么试),会发现输出结果是相同的,也就是说 mt_rand() 生成的是伪随机数。
所以这就可以爆破了,根据生成的第一个结果来对种子进行爆破,从而预测接下去所有 mt_rand() 的值
工具以及使用方法
-
php_mt_seed
-
下载网址如下,点击 php_mt_seed 4.0 进行下载
文件下载格式是 tar.gz ,于是我们丢到 linux 中进行解压。
tar -zxvf php_mt_seed-4.0.tar.gz
解压完成后进入目录
执行如下命令
make # 生成一个可执行文件
time ./php_mt_seed [第一个结果]
这时候就会开始爆破了,会把结果和对应的 php 版本均显示出来,要用对应的版本号进行调试哦!
比如我们试试刚刚的 123
make
time ./php_mt_seed 1495656191 # 1495656191 是 123 生成的第一个结果
如图所示就是结果:
有的情况下会爆破出好几个种子 根据实际情况取用。