php无文件攻击(一) - fastcgi
字数 1427 2025-08-10 08:29:04

PHP无文件攻击技术分析:FastCGI协议利用

一、技术背景

随着HW行动和攻防对抗强度提高,传统webshell文件落地检测技术日益成熟,无文件攻击成为新的研究趋势。本文介绍通过模拟FastCGI协议直接控制php-fpm执行任意PHP代码的方法,全程无需文件落地。

二、PHP常见部署架构

典型PHP Web项目部署模式:

  • Nginx作为反向代理
  • php-fpm处理PHP请求

标准访问流程:

  1. 用户请求通过Nginx接收
  2. Nginx按照FastCGI协议打包请求
  3. 通过TCP传递给php-fpm
  4. 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执行任意代码。

攻击前提条件

  1. php-fpm服务可被直接访问
  2. 需要利用PHP的两个配置项:
    • auto_prepend_file:在执行目标文件前包含指定文件
    • auto_append_file:在执行目标文件后包含指定文件

关键利用技术

设置auto_prepend_filephp://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://input
  • PHP_ADMIN_VALUE:设置allow_url_include = On
  • POST内容为要执行的PHP代码,如<?php phpinfo(); exit; ?>

六、环境变量说明

  1. PHP_VALUE

    • 可设置模式为PHP_INI_USERPHP_INI_ALL的PHP配置选项
  2. PHP_ADMIN_VALUE

    • 可设置所有PHP配置选项
    • 例外:disable_functions无法通过此方式修改(在PHP加载时已确定)

七、攻击实现参考

可参考phith0n构建的FastCGI客户端代码:
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

八、防御检测方案

  1. 检测PHP_VALUEPHP_ADMIN_VALUE中敏感字段是否被修改:

    • auto_prepend_file
    • auto_append_file
    • allow_url_include
  2. 由于php-fpm可能有多个worker,需循环检测多次以覆盖所有worker

九、技术总结

该攻击方式特点:

  1. 完全无文件落地
  2. 直接与php-fpm交互,绕过Web服务器层
  3. 利用PHP配置项实现代码执行
  4. 需要php-fpm暴露或可通过SSRF访问

防御重点:

  1. 限制php-fpm访问(绑定127.0.0.1,设置访问控制)
  2. 监控异常FastCGI请求
  3. 限制PHP危险配置项的修改权限
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参数: 关键参数: 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内容,从而执行攻击者构造的代码。 五、攻击数据包构造 示例攻击协议包: 关键攻击参数: PHP_VALUE :设置 auto_prepend_file = php://input PHP_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_file auto_append_file allow_url_include 由于php-fpm可能有多个worker,需循环检测多次以覆盖所有worker 九、技术总结 该攻击方式特点: 完全无文件落地 直接与php-fpm交互,绕过Web服务器层 利用PHP配置项实现代码执行 需要php-fpm暴露或可通过SSRF访问 防御重点: 限制php-fpm访问(绑定127.0.0.1,设置访问控制) 监控异常FastCGI请求 限制PHP危险配置项的修改权限