是否曾经有过PHP';s rand()函数被用作漏洞利用?

是否曾经有过PHP';s rand()函数被用作漏洞利用?,php,events,random,exploit,weak,Php,Events,Random,Exploit,Weak,有人知道是否有人利用rand()的弱点来预测利用它的时间或事件吗?比如在电子游戏中生成代币或作弊 因为在PHP7之前,rand()非常容易破解。事实上,这里有一些C代码,归功于Peter Selinger,它预测给定种子的值: #include <stdio.h> #define MAX 1000 #define seed 1 main() { int r[MAX]; int i; r[0] = seed; for (i=1; i<31; i++) {

有人知道是否有人利用rand()的弱点来预测利用它的时间或事件吗?比如在电子游戏中生成代币或作弊

因为在PHP7之前,rand()非常容易破解。事实上,这里有一些C代码,归功于Peter Selinger,它预测给定种子的值:

#include <stdio.h>

#define MAX 1000
#define seed 1

main() {
  int r[MAX];
  int i;

  r[0] = seed;
  for (i=1; i<31; i++) {
    r[i] = (16807LL * r[i-1]) % 2147483647;
    if (r[i] < 0) {
      r[i] += 2147483647;
    }
  }
  for (i=31; i<34; i++) {
    r[i] = r[i-31];
  }
  for (i=34; i<344; i++) {
    r[i] = r[i-31] + r[i-3];
  }
  for (i=344; i<MAX; i++) {
    r[i] = r[i-31] + r[i-3];
    printf("%d\n", ((unsigned int)r[i]) >> 1);
  }
}
#包括
#定义最大1000
#定义种子1
main(){
int r[MAX];
int i;
r[0]=种子;
对于PHP7之前的(i=1;i),PHP使用算法生成一个随机数或简称LCG。算法工作如下:

 next_random = (previous_random * a + c) % m
 previous_random = next_random
当你第一次做一个随机数时,很明显,没有先前的随机数。这就是为什么我们提供了seed。因此,seed只是先前的第一个随机值

现在,我们知道了算法,但是我们需要知道PHP使用的
a
c
m
的值是多少。我相信每个版本的PHP使用不同的值。但是假设我们不知道这些值,我们如何猜测这个值。在我的例子中,我使用的是PHP5.6.15 Windows

srand(0);
var_dump(rand());  // 12345
var_dump(rand());  // 5758
所以,
m=getrandmax()+1
。因为种子是0,所以我们的
c=12345
。要获得值
a
,我们可以使用简单的循环猜测
a

$m  = getrandmax () + 1;
for($a = 0; $a < $m; $a++)
   if ((($a * 12345 + 12345) % $m) == 5758) 
       var_dump($a);  // in my case, 20077
现在,我能够编写与当前PHP版本相同的随机函数

class visal_rnd 
{
    function __construct($seed = 0) {
        $this->seed = $seed;
    }

    function rnd() {
        $this->seed = ($this->seed * 20077 + 12345) % 32768;
        return $this->seed;
    }
}
然而 我能够预测我自己的PHP版本,因为我对我当前的环境有很多了解,我知道一些以前的随机,我知道种子。如果攻击者几乎没有任何知识,那么攻击就不容易了

随机数生成 PHP7.0+,默认情况下使用。与线性同余生成器相比,需要猜测的参数更多。因此,它需要更多的知识

线性同余发生器坏吗?
取决于您向公众公开的信息量。如果您只生成一个随机数,而攻击者不知道
a
previous\u random
c
m
。攻击者不可能预测下一个随机数。

可能……但请记住,当它不可能出现时为了预测数字,没有人会使用这种PRNG(包括MersenneTwister,在没有太多观察位的情况下也很容易预测)。大多数桌面游戏可能会使用它,但并不太在意(事实上,速度跑者在一些旧游戏中利用了这一点,是的,不是PHP),但我可以向您保证,每个关键应用程序都将使用加密PRNG和基于熵的仔细播种(在线赌场和co)。
class visal_rnd 
{
    function __construct($seed = 0) {
        $this->seed = $seed;
    }

    function rnd() {
        $this->seed = ($this->seed * 20077 + 12345) % 32768;
        return $this->seed;
    }
}