0%

[CISCN 2019 初赛]Love_Math

博客的图片功能还未修复,因此将就的用纯文字来书写了
这题刚进去,就知道是rce了,此处绕过了一些东西,但是php关于数学的函数还是都可以调用的
按照rce常规的思路,大概是要打一个
bash: c=((_GET[abs])(((_GET[acos])))&abs=system&acos=ls)
但是在此处存在过滤啊,abs,acos什么的都是合法字符,但是_GET并不是,Susen师傅说想试试其他的绕过方法,包括取反,异或,自增,自增在此处应该是用不了的
我第一个想法,全url编码传payload,但很可惜呐,GET无法被url编码,于是我换了一个思路,检查了一下有什么函数可以使用,看了一下,有一个base_conver这个函数,OK,有操作的空间了。
base_convert函数可以进行任意进制之间的转换,众所周知高于10的进制要引入字母了,那么36进制不就是0到9到a到z,那就可以通过这个函数构造任意我们爱用的字符串,然后加个括号就变成函数了(这很好理解)
这个时候第二个要点出现了,另外一个函数hex2bin,这个更是神中神哎,可以直接将16进制的数字转为对应的字符串,转换_GET的重任交给他了
接下来就是要以什么进制的内容交给hex2bin来进行进制转字符串了
第一点,很要的就是长度要短,因为payload限制长度了
第二点,很多小可爱要问了,为什么这里不直接再用base_convert函数来进行_GET的转换–那我问你_是字母还是数字,分明啥也不是
因此确定一下本题的转换思路,由于hex2bin不在白名单中,我们需要通过base_convert来将一个常规的进制数转为36进制数,而这个36进制数为hex2bin(这个这里是个数字,但是在后面都是当字符串用的),然后再用转换后的hex2bin来构造一个_GET,这也很好理解,但是_GET直接字符转16进制,5f是在黑名单中的哦,因此要用10进制数通过某个函数来转为16进制再丢给hex2bin来转为字符串_GET,查一下白名单,dechex可以胜任这个任务
那很好操作了,很多在线工具,我们直接拿来使用,很快就能得到

1
bash: base_conver(37907361743,10,36)(dechex(6525245738836))

这个的意思就是hex2bin(某16进制数)的结果为_GET
接下来就在数学函数里面挑两个字符长度短的(这里选pi和log)来避免payload的限制,然后

1
$pi=base_conver(37907361743,10,36)(dechex(6525245738836));

($$pi){pi}(这里的意思是$_GET[pi],其实大家应该都懂),同理构造另外一个($$pi){log},然后用两个&&把pi和abs的参数传上去就可以了(注意构造一个system函数的括号,直接在前面$$pi处加就可以了),就可以实现得到flag
接下来看一下完整的payload

1
$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}($$pi){log}&pi=system&log=cat /flag

结束了,没什么意思,纯为别的师傅解答