php中mt_rand

前段时间看了雨牛发布在先知平台的PHPCMS MT_RAND SEED CRACK致authkey泄露

然后自己也合计出了一道随机数预测的题

废话

伪随机在日常的开发中经常使用到,但是其实有很多安全问题。

这里我们主要探讨php中的伪随机产生函数mt_rand()的缺陷。

php官方手册的英文版
php.net
而中文版却没有这个注释

mt_rand()

mt_rand()函数是基于梅森旋转算法的,按照官方的说法mt_rand()函数的质量高于rand()函数,但是官方也提到了这不是一个用来产生安全值的函数,因此使用需要谨慎

梅森旋转算法

lynahex' Blog

hack it!

因为现在php版本至少都是5以上了,因此5以前的mt_rand()使用不探讨,php5以后mt_rand()不需要在使用前播种

以apache为例,KeepAlive选项是为了保持Tcp连接,以增加一个连接内的http包,提升用户体验。但是php在一个tcp连接中对于种子的处理却是只产生一个种子也即,此连接中的种子如果泄漏后面的序列均可以预测。
1.php

<?php
mt_srand(123789178);
for($i=0;$i<10;$i++){
    echo mt_rand()."\r\n";
}
?>

播种
获取种子可以使用
php_mt_seed

暴力出种子,然后就可以在同一个连接内胡作非为了
种子

应用如果是使用相同的种子,那么很轻松就可以搞出产生的session或者key了。

如果是同一个tcp连接内产生的种子,那么就需要将这个种子的产生的结果往后偏移一位

此处评论已关闭