CVE-2012-1823是PHP-CGI在CGI模式下因RFC 3875规范导致的远程代码执行漏洞,仅影响PHP < 5.3.12或< 5.4.2版本,需Apache+ScriptAlias调用php-cgi且querystring不含未解码“=”才能触发。

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)并拦截了含-开头的 querystring -
AllowOverride 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,且以 - 开头
这是触发点,也是最容易失败的环节:
立即学习“PHP免费学习笔记(深入)”;
- 正确示例:
<a href="https://www.php.cn/link/f54396099d46369b547c1aa13ed5d028">https://www.php.cn/link/f54396099d46369b547c1aa13ed5d028</a>(显示语法高亮源码) - 错误示例:
-
<a href="https://www.php.cn/link/4350ee1e7124070f1f5088825be75fb9">https://www.php.cn/link/4350ee1e7124070f1f5088825be75fb9</a>(含=→ 不传参) -
<a href="https://www.php.cn/link/d0c72bcb851bc17ca4fe01bf2e05c235">https://www.php.cn/link/d0c72bcb851bc17ca4fe01bf2e05c235</a>(%3d是 URL 编码后的=,解码后仍含=→ 被跳过) - 使用 POST 请求体传参(无效,该漏洞只响应 querystring)
-
当前时间是 2026 年,PHP 5.4.1 已彻底 EOL 超十年,所有生产环境都不该再使用;复现仅限隔离靶机,且注意现代 WAF/IDS(如 ModSecurity 3.x、Cloudflare 规则集)会直接拦截 ?- 类请求——这不是环境没配对,而是防御层提前截断了。



















