x.

x. 拓展部分

x.x 伪随机数

mt_rand() 属于伪随机数函数,其结果并不是真正随机,而是基于“随机种子”通过固定算法计算得到;当开发者手动使用 mt_srand(固定值) 初始化种子时,后续生成的随机数序列会完全固定,例如第一次、第二次、第三次 mt_rand() 的结果永远一致,因此攻击者只需知道种子即可精准预测随机数,而不是盲目爆破;如果不手动指定种子,PHP 会自动根据时间、系统熵等信息初始化随机种子,所以每次运行程序时生成的随机数通常都会不同。

结论是不要用 mt_rand() 做任何安全相关的事,应改用 PHP random_int 官方文档PHP random_bytes 官方文档;其中 random_int() 适合生成安全验证码、Token、随机ID,random_bytes() 适合生成高强度随机字节流或加密材料。

<?php

error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(372619038);
    if(intval($r)===intval(mt_rand())){
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}