主角函数
-
mt_srand()
-
mt_rand()
mt_srand(seed)函数通过分发seed种子,依靠mt_rand()使用 Mersenne Twister算法返回随机整数。
但是此种随机属于伪随机,如果种子不变,在第二次运行程序生成的随机数序列会与第一次相同,因此产生的随机数实际上是可以预测的。
具体可以看下面这篇文章:
https://blog.csdn.net/qq_58784379/article/details/121715072
话不多说,开始今天的例题复现:
大致的意思就是将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脚本:
来源地址:https://blog.csdn.net/m0_73973498/article/details/133414448