bypass_disable_functions

get shell

img 打开以后发现是这样的,我以为是被加密了,直接把上面的内容粘贴复制搜索,后来发现,是使用了混淆代码的工具,拿去解密一下就可以得到以下内容
1
2
3
4
<?php
highlight_file(njVysBZvxrLkFYdNofcgGuawDJblpOSQEHRUmKiAhzICetPMqXWT);
@eval($_POST[ymlisisisiook]);
?>

解密网址如下:https://www.zhaoyuanma.com/phpjm.html
看起来是个一句话木马,用蚁剑连接试试:
img
接下来我想访问一下其他文件夹试试,发现是没有权限的,这个时候就要想想如何提权了?

打开命令执行窗口,发现不论输入什么指令都是ret
img
搜索一下这个ret=127什么意思,发现是绕过disable_functions

接下来就直接去百度如果bypass_disable_functions这里介绍说可以直接用antsword里面的插件

使用antsword插件进行绕过

img 接下来会在目录下生成一个php文件,直接再用蚁剑访问连接,密码依旧是之前那个 img 接下来就可以发现flag在根目录下了

了解原理

其实感觉用插件不明不白的,所以决定要深入学习一下

原因:

为什么会使用不了系统命令呢?
disable_functions开关在php.ini中可以关闭一些危险的功能,如系统、执行等

img img 因为在这个disable_functions这里禁用了很多函数。  **open_basedir** 网站内目录与目录之间是可以访问的,在某些特定情况下这样是不安全的,如果目录间网址权限被黑客利用很可能造成数据流失,在这里我们可以通过PHPopen_basedir来实现网站间目录隔离配置,从而提高网站安全。 注:网站间隔离用“:”号分割。 注:没有被包含的网站不可访问。 img

PS:这里我之前想说尝试用文件包含漏洞看看能不能访问根目录的内容,但是因为有这个限制在,所以不行
所以接下来我们需要绕过这两个东西

绕过思路

第一种,攻击后端组件,寻找存在命令注入的、web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash 的破壳漏洞;
第二种,寻找未禁用的漏网函数,常见的执行命令的函数有 system()、exec()、shell_exec()、passthru(),偏僻的 popen()、proc_open()、pcntl_exec(),逐一尝试,或许有漏网之鱼;
第三种,mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制;
第四种,利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果。
参考:https://www.freebuf.com/articles/web/192052.html

但今天我们就直接看一下第四种方法

基础知识学习

linux动态库(so共享对象库),静态库

一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)动态函数库同*共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, ****文件后缀是****.dll)**

今天我们需要学习的就是动态函数库,因为需要创建.so文件

共享函数库:

**定义:**共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装,所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多可以实现的功能:
1、升级了函数库但是仍然允许程序使用老版本的函数库。
2、当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。
3、可以在库函数被使用的过程中修改这些函数库。

PHP启动外部程序:

PHP启动外部程序有两种,常见的就是使用cat,system等指令,但是在这里是用不了的
https://segmentfault.com/a/1190000008941850
还有一种就是通过PHP解释器:这里直接摘抄大佬的思路:比如,php 函数 goForward() 实现“前进”的功能,php 函数 goForward() 又由组成 php 解释器的 C 语言模块之一的 move.c 实现,C 模块 move.c 内部又通过调用外部程序 go.bin 实现,那么,我的 php 脚本中调用了函数 goForward(),势必启动外部程序 go.bin。

LD_PRELOAD环境变量:

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

LD_PRELOAD实现思路(思路重点)

在看完大佬的思路解析后,我来复现一下,首先我们知道LD_PRELOAD可以允许我们定义在程序运行前优先加载的动态链接库,此时我们设这个库为e_evil.so,在这个库中我们可以加入可以执行的恶意代码,注意此时这个库中的代码是不受disable_functions限制的,因为他不是这个系统当中,是我们后来定义的,那么有人会问,为啥执行的是我们定义的这个库里的系统函数,而不是原本存在的?这里就是因为我们一开始说的因为它的优先级比较高,那么如何使得我们定义的这个系统之外的函数被加载呢?那就需要我们通过web打开新进程。

插件使用条件

成功使用此绕过插件的三个必要条件是:

1.mail()函数和error_log()函数所调用的sendmail已安装
2.不限制 /usr/sbin/sendmail 的执行
3.mail()函数和error_log()函数有一个未被禁用

小结

在这里有个点,一开始我是直接大神的bypass工具集,在操作的时候发现怎么都没法输出,后来重新看了一下文章,他是使用mail()函数,但是在本题当中,mail函数是被禁用的,所以最终就失败了。
其实现在对于这个bypass的原理差不多已经清晰了,感觉这个思路确实很厉害,是以一种劫持的思想绕过disable_function的拦截。

参考大神链接:https://www.freebuf.com/articles/web/192052.html
antsword插件运行原理细节:https://www.anquanke.com/post/id/195686

Author

vague huang

Posted on

2021-02-06

Updated on

2021-02-08

Licensed under

Comments