本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是php伪随机数
让我们先观察一下这两个函数
mt_scrand()
mt_rand()
mt_scrand(seed)这个函数的意思就是分发seed种子,种子有了后,靠mt_rand()生成随机数。
例如我们写一个脚本
<?php
mt_srand(55555);
echo mt_rand()."<br/>";
?>
//输出277249736
如果我们多输入几次呢
<?php
mt_srand(12345);
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?>
//输出277249736<br/>230135029<br/>1872932720<br/>1536240435<br/>
大家可以发现,这个随机数是不是不是这么随机,这就是伪随机数的漏洞,存在可预测性。
为了方便理解,我将其认为是线性的给大家画个图演示一下
(画的不好不要在意)x就是我们所说的种子,知道了种子和伪随机数就可以推y了
通过以上的举例说明,我们便可以推出以下的结论:
1.当我们知道种子数,便可以推出伪随机数列。
2.当我们知道伪随机数列,便可以推出种子。
当我们知道这些后,大家可以想一下,应该如何破解伪随机数呢?我们接下来来介绍一个工具
php_mt_seed
该工具专门用来爆破种子
贴一个官方网站:www.openwall.com/php_mt_seed…
用法:
将文件夹放进kali,进入该文件目录里,首次使用先输入make,然后
./php_mt_seed 所要爆破的随机数
我们举几个例子
example1
先写一个脚本
<?php
function user_password() {
return mt_rand();
}
echo user_password(), "\n";
echo user_password(), "\n";
echo user_password(), "\n";
echo user_password(), "\n";
?>
我们随机分配密码,运行后
266584478
1966871117
983911992
151017562
如果我们只知道第一个密码,也就是266584478,那我们是否能利用工具将后面三个密码给推出来呢,我们用上面提到的工具对第一个密码进行爆破
跑出来种子276062199(这里注意一点php版本是要匹配的,否则随机出来的数是不同的)
接下来我们写个脚本,已知种子跑随机数
<?php
mt_srand(276062199);
for($i=0;$i<4;$i++){
echo mt_rand()." ";
}
?>
运行出来
266584478 1966871117 983911992 151017562
可以看到我们推出了后三个密码,当然这是最简单的例子,接下来我们进阶一下。