蚁剑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限制。具体流程:
- 上传恶意扩展文件(.so或.dll)
- 通过FastCGI协议发送特殊请求
- 加载扩展并执行命令
- 启动本地PHP服务作为代理
2. 关键技术点
- PHP-FPM协议:FastCGI协议的PHP实现,默认监听9000端口
- PHP_ADMIN_VALUE:可动态修改PHP配置参数
- 动态扩展加载:通过修改二进制文件实现命令注入
三、详细实现步骤
1. 环境准备
# 安装必要工具
apt update && apt install iproute procps
2. 攻击流程
-
生成恶意扩展:
- 修改二进制扩展文件,在特定偏移位置注入命令
- 命令格式:
php -n -S 127.0.0.1:[60000-65000] -t [web目录]
-
上传组件:
- 上传修改后的扩展文件
- 上传代理脚本(.antproxy.php)
-
FastCGI攻击:
$client = new Client('${fpm_host}', ${fpm_port}); $content = ""; $params = [ 'PHP_VALUE' => 'extension=${p}', 'PHP_ADMIN_VALUE' => 'extension=${p}' ]; -
启动代理服务:
- 通过扩展执行命令启动新的PHP服务
- 所有后续请求通过代理转发到新服务
3. 扩展文件分析
扩展文件关键特征:
- 使用汇编编写,体积小
- 核心功能是执行system()命令
- 二进制文件中预留了命令注入空间(特定偏移位置)
修改方法示例:
// 在二进制文件的275-504字节位置写入命令
fileBuff.write(cmd, start);
四、技术细节分析
1. 为什么需要启动新PHP服务
- 绕过原始环境的disable_functions限制
- 使用
-n参数忽略php.ini配置 - 提供持久化访问通道
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;
}
五、防御措施
-
限制PHP-FPM访问:
- 配置listen.allowed_clients
- 使用Unix socket代替TCP端口
-
文件监控:
- 监控异常.so/.dll文件上传
- 检查临时目录文件变化
-
权限控制:
- PHP进程以低权限用户运行
- 限制PHP执行系统命令的能力
-
日志审计:
- 监控异常PHP进程启动
- 记录PHP_ADMIN_VALUE修改操作
六、总结
该技术通过组合利用PHP-FPM协议和动态扩展加载,有效绕过disable_functions限制。防御方应重点关注:
- PHP-FPM服务暴露问题
- 动态扩展加载风险
- 异常PHP进程监控
攻击方则需注意:
- 扩展文件的版本兼容性
- 攻击痕迹清理
- 代理服务的隐蔽性