php伪随机漏洞----台州市赛一道web题

主角函数

  • mt_srand()

  • mt_rand()

mt_srand(seed)函数通过分发seed种子,依靠mt_rand()使用 Mersenne Twister算法返回随机整数。

但是此种随机属于伪随机,如果种子不变,在第二次运行程序生成的随机数序列会与第一次相同,因此产生的随机数实际上是可以预测的。

具体可以看下面这篇文章:

https://blog.csdn.net/qq_58784379/article/details/121715072

话不多说,开始今天的例题复现:

 <?php
error_reporting(0);
$Seed = str_split(uniqid(),10)[1];  //生成随机数种子
extract(getallheaders());            //获取请求头信息
mt_srand($Seed);                        //播种
$flag = str_split(file_get_contents("/flag"));     //读取flag文件并将每个字符放入数组
$result = "";
foreach ($flag as $value){
    $result = $result . chr(ord($value)+mt_rand(1,2));  //遍历flag并将每一个字符加上1或2
}
if (isset($Answer)){

    if ($Answer == substr($result,0,strlen($Answer))){    //用于判断flag
        echo "wow~";
    }else{
        echo "no~";
    }
}else{
    highlight_file(__FILE__);
    echo "no~";
}  no~

        大致的意思就是将flag简单加密,每一个字符加上1或2,通过answer与加密后的flag比较产生的返回值,来一次读取flag。由上面内容可知,我们只需知道随机数种子,就能知道mt_rand(1,2)每次产生的到底是1还是2,那我们该如何知道随机数种子呢,uniqid也是产生随机数并且我们不能预测。这时候,extract(getallheaders())这个函数就显得很由蹊跷了。了解变量覆盖的人都懂extract函数的实力。

extract函数会把数组中的键值当作变量名,value当作变量的值,若变量名不存在,则创建这样的变量,若存在,则覆盖先前的值,因此可以执行变量覆盖。

而gettallheaders()这个函数刚好会将请求头信息变成数组输出,类似于这样:

Array

(

[0] => HTTP/1.1 200 OK

[Date] => Sat, 29 May 2004 12:28:14 GMT

[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)

[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT

[ETag] => "3f80f-1b6-3e1cb03b"

[Accept-Ranges] => bytes

[Content-Length] => 438

[Connection] => close

[Content-Type] => text/html

)

因此答案就呼之欲出了,我们只需要添加seed和answer到header中,就会自动覆盖原先seed和answer的值,做到seed可控。下面贴一下payload脚本:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值