cve-2012-1823是php-cgi在cgi模式下因rfc 3875规范导致的远程代码执行漏洞,仅影响php
CVE-2012-1823在PHP 5.4.1上可稳定复现,但必须满足精确的运行模式与环境组合,不是装上 PHP 就能触发。必须是 CGI 模式,不是 FastCGI 或 mod_php
php-cgi进程必须以传统 CGI 方式被 Web 服务器调用(即每次请求 fork 一个新进程),而非长期驻留的php-fpm或 Apache 的mod_php。
- 常见可复现环境:Apache +
ScriptAlias指向php-cgi可执行文件(如/usr/bin/php-cgi或 Windows 下php-cgi.exe)- 不起作用的情况:
- Nginx + php-fpm
- Apache +
libphp(即mod_php)- PHP 以 CLI 模式直接运行
Apache 需启用 CGI 解析且未禁用 QUERY_STRING 参数传递
RFC 3875 要求:当请求的
QUERY_STRING中不含未解码的=字符时,Web 服务器应将其作为命令行参数传给 CGI 程序。
- Apache 默认遵守该行为,但部分加固配置会禁用:
CGIDScript或ScriptAlias被注释或路径错误- 启用了
SecFilterEngine On(ModSecurity)并拦截了含-开头的 querystringAllowOverride None导致 .htaccess 重写规则失效(若依赖它触发)PHP 编译/配置不能禁用 CGI SAPI
- 运行
php -v输出中必须包含cgi-fcgi(表示 CGI SAPI 已编译);仅显示cli的二进制无法复现- Windows 下常见路径:
C:/xampp/php/php-cgi.exe(XAMPP 1.8.1 默认含此漏洞版本)- Linux 下需确认:
which php-cgi存在且可执行php-cgi -v输出版本为5.4.1(非 5.4.10+,因补丁已合入 5.3.12/5.4.2)请求必须构造无
=的 querystring,且以-开头这是触发点,也是最容易失败的环节:
- 正确示例:
@#@#@#@#@#@#@#@#@#@0(显示语法高亮源码)- 错误示例:
@#@#@#@#@#@#@#@#@#@1(含=→ 不传参)@#@#@#@#@#@#@#@#@#@2(%3d是 URL 编码后的=,解码后仍含=→ 被跳过)- 使用 POST 请求体传参(无效,该漏洞只响应 querystring)
当前时间是 2026 年,
PHP 5.4.1已彻底 EOL 超十年,所有生产环境都不该再使用;复现仅限隔离靶机,且注意现代 WAF/IDS(如 ModSecurity 3.x、Cloudflare 规则集)会直接拦截?-类请求——这不是环境没配对,而是防御层提前截断了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!












