随机数种子爆破
在PHP中,变量以
理论上,如果选取字符的时候是完全随机的,那么几乎不可能出现 password参数值与
访问题目页面,可得到前10个字节的随机字符,将输出的随机字符转换为php_mt_seed可识别的数据格式。使用
Python3脚本进行转换:
str1变量的值就是PHP代码中的
将输出的字符输入到编译好的php_mt_seed工具中,具体指令如下:
最终我们找到一个随机数种子 19290735(PHP7.1)。在这一步需要注意的是,mt_rand()函数本身确 实存在问题,但是根据PHP版本的不同,其生成的随机数会略有区别。 所以,在实际题目中一定要注意PHP版本问题,不能脱离PHP版本来做 题。
利用得到的随机数种子编写PHP脚本,如下所示:
尝试将该结果提交给服务端,即可成功得到flag。
本质上是因为mt_rand()函数的不安全性导致的。所以,我们需要明确 以下几点:
- mt_rand()函数的不安全性是考点的核心。
2)要爆破随机数种子,首先需要得到mt_rand()函数生成的随机数序
列。
3)mt_rand()函数生成的随机数序列可能以不同的形式表现(例如生成 随机字符串)。
4)相同函数在不同的PHP版本(大版本)中的实现代码可能是不一样 的。例如,在PHP7和PHP5中,mt_rand()函数的实现算法是完全不同 的。
5)计算机中不存在真正的随机数,这是mt_rand()函数存在安全问题的 根本原因。