相关函数

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
2
3
4
<?php
mt_srand(123456);
echo mt_rand()."<br/>";
?>

运行得到结果: 然后在运行一次: 发现两次随机数的结果是一样的,那么我改下代码多输出几次试一下:

1
2
3
4
5
6
7
8
<?php  
mt_srand(123456);
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?>

运行两次: 发现虽然执行时每条随机序列都不一样,但是每次执行的结果却是相同的 这就是伪随机数的漏洞,生成的伪随机数是线性的,像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
2
$ make
gcc -Wall -march=native -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed

然后测试一下刚才使用123456种子生成的伪随机数272665632: 等待一会就得到了种子,这里爆出了8个种子,再把它带回函数验证就能得到正确的种子123456了 这里需要注意验证时要对应爆出种子的php版本号,还有在使用爆破脚本时尽量取第一个随机序列,如果不是第一次生成的随机数,爆出来的种子,不一定正确 在 php > 4.2.0 的版本中,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已由 PHP 自动完成。php 中产生一系列的随机数时,只进行了一次播种,而不是每次调用 mt_rand() 都进行播种。