前言
这一段遇到了一个关于伪随机数的题目,当时没有做出来,看完writeup之后,感觉很有意思,所以就记录下来
php伪随机数漏洞
php中重要的几个随机函数rand() 不指定参数时,范围0-32767
mt_rand() 不指定参数时,范围0-2^32-1
srand() 给rand()函数播种
mt_srand() 给mt_srand()函数播种
php是基于C开发的,C中生成随机数时,需要自己去一个种子,相同的种子产生的随机数是相同的,php中也一样
自己的理解:mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。
所以,当种子一定时,接下来几次的随机数都是固定的
测试代码:<?php
mt_srand(1433223);
echo mt_rand()."
";
echo mt_rand()."
";
echo mt_rand()."
";
echo mt_rand()."
";
echo mt_rand()."
";
?>
页面输出:2068220702
2001673607
410303409
475448501
1250041484
发现随机种子 确定下来 无论怎么刷新 页面返回的一直是这几个随机数
同时我们应该注意,mt_srand()函数播种的时候,只有在第一次调用mt_rand()函数的时候才会使用。所以如果我们知道了第一次生成的随机数值,就可能爆破出随机数种子。
发现爆出了5个可能的种子
通过验证可以知道那个是正确的种子
注意:如果不是第一次生成的随机数,爆出来的种子,不一定正确
在 php > 4.2.0 的版本中,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已由 PHP 自动完成。php 中产生一系列的随机数时,只进行了一次播种,而不是每次调用 mt_rand() 都进行播种。
# web漏洞