php伪随机数及爆破脚本的使用
相关函数
mt_srand()
mt_rand()
定义和用法
mt_srand():
播种 Mersenne Twister 随机数生成器。
语法
1 | mt_srand(seed) |
参数
描述
seed
必需。用 seed 来给随机数发生器播种。
mt_rand() :
mt_rand():使用 Mersenne Twister 算法返回随机整数。 语法:mt_rand(min,max); 参数列表:
参数
描述
min
可选,范围最小数
max
可选,范围最大数
大概意思就是说通过mt_srand(seed)这个函数分发seed种子,然后种子有了后,靠mt_rand()生成随机数。
漏洞演示
首先,我是用php代码生成一段随机数:
1 | <?php |
运行得到结果: 然后在运行一次: 发现两次随机数的结果是一样的,那么我改下代码多输出几次试一下:
1 | <?php |
运行两次: 发现虽然执行时每条随机序列都不一样,但是每次执行的结果却是相同的 这就是伪随机数的漏洞,生成的伪随机数是线性的,像y=ax+b一样,a就类似于种子,知道伪随机序列后就可以推出种子a
爆破脚本的利用
现在官网下载php_mt_seed-PHP mt_rand()种子破解程序 [[php_mt_seed - PHP mt_rand() seed cracker (openwall.com)](https://www.openwall.com/php_mt_seed/)]]): 官网网址 放到kali里解压: 解压之后使用命令更新一下就可以使用了:
1 | $ make |
然后测试一下刚才使用123456种子生成的伪随机数272665632: 等待一会就得到了种子,这里爆出了8个种子,再把它带回函数验证就能得到正确的种子123456了 这里需要注意验证时要对应爆出种子的php版本号,还有在使用爆破脚本时尽量取第一个随机序列,如果不是第一次生成的随机数,爆出来的种子,不一定正确 在 php > 4.2.0 的版本中,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已由 PHP 自动完成。php 中产生一系列的随机数时,只进行了一次播种,而不是每次调用 mt_rand() 都进行播种。