CVE-2012-1823及其绕过CVE-2024-4577仅影响以CGI模式运行PHP的容器,明确受影响的有:Apache+mod_cgi(如AddHandler cgi-script .php配置)、旧版lighttpd+fastcgi.spawn(未禁用环境透传)、自定义Shell网关脚本;默认不受影响的包括Apache+mod_php、nginx+php-fpm、Apache+proxy_fcgi及IIS+PHP Manager。

PHP 5.3.11 中的 php-cgi 漏洞(即 CVE-2012-1823 及其绕过 CVE-2024-4577)**只影响以 CGI 模式运行 PHP 的 Web 容器**,且必须满足“将 QUERY_STRING 直接作为命令行参数传递给 php-cgi 进程”这一关键条件。Apache mod_php、php-fpm、nginx + FastCGI 等主流现代部署方式默认不受影响。
哪些 Web 容器明确受影响
漏洞触发依赖底层 Web 服务器如何调用 php-cgi 二进制文件。以下容器在默认或常见配置下存在风险:
-
Apache + mod_cgi:使用
AddHandler cgi-script .php或类似配置,让 Apache 把.php文件当作 CGI 脚本执行 —— 此时QUERY_STRING会被原样传入php-cgi命令行,?-s或?%2ds可直接触发源码泄露或代码执行 -
lighttpd + fastcgi.spawn(旧版配置):若未显式禁用环境变量透传,且
PHP_FCGI_CHILDREN等设置不当,部分 lighttpd 1.4.x 配置可能将未过滤的QUERY_STRING注入启动参数 -
自定义 Shell 脚本网关:例如用 Bash 脚本包装
php-cgi并拼接$QUERY_STRING,且未做-开头校验或空格截断处理
哪些 Web 容器默认不受影响
这些容器不把用户请求的 QUERY_STRING 当作命令行参数,因此无法触发该漏洞链:
-
Apache + mod_php:PHP 作为 Apache 模块运行,无独立
php-cgi进程,QUERY_STRING仅作为 PHP 超全局变量存在 -
nginx + php-fpm:FastCGI 协议通过 socket 传输结构化请求数据,
QUERY_STRING是 FastCGI 参数字段,不会进入php-fpm进程的argv - Apache + php-fpm(proxy_fcgi):同上,走 FastCGI 协议,与 CGI 模式本质不同
- IIS + PHP Manager:默认使用 FastCGI 方式,除非手动配置为 CGI 执行器(极罕见)
为什么 nginx 经常被误认为中招
这不是 nginx 本身的问题,而是运维配置偏差导致的“连带风险”:
立即学习“PHP免费学习笔记(深入)”;
- 有人在 nginx 配置中错误地写成
fastcgi_pass 127.0.0.1:9000后又额外加了fastcgi_param SCRIPT_FILENAME /path/to/php-cgi,试图手动调起php-cgi—— 这已脱离 FastCGI 规范,实际退化为 CGI 调用 - 某些老旧一键包(如早期 LNMP.org v1.2)在未启用 php-fpm 时,会 fallback 到用
cgi-bin目录跑php-cgi,此时 nginx 充当反向代理角色,漏洞由后端 CGI 服务承担 -
php-cgi二进制被直接暴露在 Web 可访问路径下(如/cgi-bin/php-cgi),攻击者绕过 Web 容器,直接请求该脚本 —— 此时任何能发 HTTP 请求的客户端都可利用,与容器无关
快速自查方法
无需翻配置,一行命令即可验证是否处于风险路径:
- 访问任意 PHP 页面,末尾追加
?-s(如/index.php?-s) - 若页面返回原始 PHP 源码(含
<?php),说明你正在用 CGI 模式,且未打补丁 - 若返回 404、500 或正常渲染,大概率不在该漏洞影响路径内
- 补充验证:执行
ps aux | grep php-cgi,若看到进程命令行中包含-s、-d或明显来自 URL 的参数,即确认被注入
真正麻烦的不是容器类型,而是那些混用了 CGI 启动逻辑又没做参数清理的边缘配置 —— 它们往往藏在迁移脚本、遗留测试环境或第三方模板里,最容易被漏掉。



















