蚁剑disable_functions研究
字数 1235 2025-08-26 22:11:34

PHP-FPM Bypass disable_functions 技术分析与实践

一、技术背景

PHP的disable_functions是PHP安全配置中用于限制危险函数执行的重要机制。传统WebShell在遇到disable_functions限制时,常规函数如system()、exec()等无法使用,导致攻击受阻。本文介绍基于PHP-FPM协议和动态扩展加载的绕过技术。

二、技术原理

1. 核心思路

通过PHP-FPM协议直接与FastCGI通信,利用PHP_ADMIN_VALUE加载自定义扩展,从而绕过disable_functions限制。具体流程:

  1. 上传恶意扩展文件(.so或.dll)
  2. 通过FastCGI协议发送特殊请求
  3. 加载扩展并执行命令
  4. 启动本地PHP服务作为代理

2. 关键技术点

  • PHP-FPM协议:FastCGI协议的PHP实现,默认监听9000端口
  • PHP_ADMIN_VALUE:可动态修改PHP配置参数
  • 动态扩展加载:通过修改二进制文件实现命令注入

三、详细实现步骤

1. 环境准备

# 安装必要工具
apt update && apt install iproute procps

2. 攻击流程

  1. 生成恶意扩展

    • 修改二进制扩展文件,在特定偏移位置注入命令
    • 命令格式:php -n -S 127.0.0.1:[60000-65000] -t [web目录]
  2. 上传组件

    • 上传修改后的扩展文件
    • 上传代理脚本(.antproxy.php)
  3. FastCGI攻击

    $client = new Client('${fpm_host}', ${fpm_port});
    $content = "";
    $params = [
        'PHP_VALUE' => 'extension=${p}',
        'PHP_ADMIN_VALUE' => 'extension=${p}'
    ];
    
  4. 启动代理服务

    • 通过扩展执行命令启动新的PHP服务
    • 所有后续请求通过代理转发到新服务

3. 扩展文件分析

扩展文件关键特征:

  • 使用汇编编写,体积小
  • 核心功能是执行system()命令
  • 二进制文件中预留了命令注入空间(特定偏移位置)

修改方法示例:

// 在二进制文件的275-504字节位置写入命令
fileBuff.write(cmd, start);

四、技术细节分析

1. 为什么需要启动新PHP服务

  1. 绕过原始环境的disable_functions限制
  2. 使用-n参数忽略php.ini配置
  3. 提供持久化访问通道

2. 多版本兼容性问题

PHP扩展需要匹配具体版本号,包括小版本。解决方案:

  • 为不同PHP版本编译多个扩展
  • 动态检测环境并选择合适扩展

3. 替代方案

可以直接在扩展中实现命令执行功能,如:

PHP_FUNCTION(antsystem) {
    char *command;
    size_t command_len;
    
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &command, &command_len) == FAILURE) {
        RETURN_FALSE;
    }
    
    system(command);
    RETURN_TRUE;
}

五、防御措施

  1. 限制PHP-FPM访问

    • 配置listen.allowed_clients
    • 使用Unix socket代替TCP端口
  2. 文件监控

    • 监控异常.so/.dll文件上传
    • 检查临时目录文件变化
  3. 权限控制

    • PHP进程以低权限用户运行
    • 限制PHP执行系统命令的能力
  4. 日志审计

    • 监控异常PHP进程启动
    • 记录PHP_ADMIN_VALUE修改操作

六、总结

该技术通过组合利用PHP-FPM协议和动态扩展加载,有效绕过disable_functions限制。防御方应重点关注:

  1. PHP-FPM服务暴露问题
  2. 动态扩展加载风险
  3. 异常PHP进程监控

攻击方则需注意:

  1. 扩展文件的版本兼容性
  2. 攻击痕迹清理
  3. 代理服务的隐蔽性
PHP-FPM Bypass disable_ functions 技术分析与实践 一、技术背景 PHP的disable_ functions是PHP安全配置中用于限制危险函数执行的重要机制。传统WebShell在遇到disable_ functions限制时,常规函数如system()、exec()等无法使用,导致攻击受阻。本文介绍基于PHP-FPM协议和动态扩展加载的绕过技术。 二、技术原理 1. 核心思路 通过PHP-FPM协议直接与FastCGI通信,利用PHP_ ADMIN_ VALUE加载自定义扩展,从而绕过disable_ functions限制。具体流程: 上传恶意扩展文件(.so或.dll) 通过FastCGI协议发送特殊请求 加载扩展并执行命令 启动本地PHP服务作为代理 2. 关键技术点 PHP-FPM协议 :FastCGI协议的PHP实现,默认监听9000端口 PHP_ ADMIN_ VALUE :可动态修改PHP配置参数 动态扩展加载 :通过修改二进制文件实现命令注入 三、详细实现步骤 1. 环境准备 2. 攻击流程 生成恶意扩展 : 修改二进制扩展文件,在特定偏移位置注入命令 命令格式: php -n -S 127.0.0.1:[60000-65000] -t [web目录] 上传组件 : 上传修改后的扩展文件 上传代理脚本(.antproxy.php) FastCGI攻击 : 启动代理服务 : 通过扩展执行命令启动新的PHP服务 所有后续请求通过代理转发到新服务 3. 扩展文件分析 扩展文件关键特征: 使用汇编编写,体积小 核心功能是执行system()命令 二进制文件中预留了命令注入空间(特定偏移位置) 修改方法示例: 四、技术细节分析 1. 为什么需要启动新PHP服务 绕过原始环境的disable_ functions限制 使用 -n 参数忽略php.ini配置 提供持久化访问通道 2. 多版本兼容性问题 PHP扩展需要匹配具体版本号,包括小版本。解决方案: 为不同PHP版本编译多个扩展 动态检测环境并选择合适扩展 3. 替代方案 可以直接在扩展中实现命令执行功能,如: 五、防御措施 限制PHP-FPM访问 : 配置listen.allowed_ clients 使用Unix socket代替TCP端口 文件监控 : 监控异常.so/.dll文件上传 检查临时目录文件变化 权限控制 : PHP进程以低权限用户运行 限制PHP执行系统命令的能力 日志审计 : 监控异常PHP进程启动 记录PHP_ ADMIN_ VALUE修改操作 六、总结 该技术通过组合利用PHP-FPM协议和动态扩展加载,有效绕过disable_ functions限制。防御方应重点关注: PHP-FPM服务暴露问题 动态扩展加载风险 异常PHP进程监控 攻击方则需注意: 扩展文件的版本兼容性 攻击痕迹清理 代理服务的隐蔽性