cve-2012-1823是php 5.3.12/5.4.2前cgi模式下php-cgi的远程代码执行漏洞,因query_string无“=”且以“-”开头被apache当作命令行参数传递,导致-d、-s等开关生效,引发源码泄露或任意命令执行。

CVE-2012-1823 是 PHP 5.4.1 中 php-cgi 的核心攻击入口,特征非常鲜明:QUERY_STRING 无等号(=)且以短横线(-)开头,被 Apache 直接当作命令行参数传给 php-cgi 进程执行。
HTTP 请求中 QUERY_STRING 出现 -d 参数是关键信号
Apache 按 RFC3875 将不带 = 的 querystring 当作 CGI 参数传递,PHP-CGI 在解析时未做足够过滤,导致 -d allow_url_include=on 这类参数生效。典型请求 URL 如:
GET /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1
- 必须是 GET 或 POST(POST body 可配合
php://input注入代码) -
QUERY_STRING中不能出现未编码的=,否则 Apache 不会触发参数传递逻辑 -
-d后紧跟 PHP 配置项,常见组合有:-d allow_url_include=on、-d auto_prepend_file=php://input、-d cgi.force_redirect=0 - 参数值需 URL 编码,如空格 →
+或%20,=→%3d
响应行为异常比返回内容更值得警惕
成功触发后,服务端不一定返回可读的 phpinfo() 或 id 输出,反而常出现以下现象:
- HTTP 状态码为 200,但响应体为空、乱码或截断(因
php-cgi进程在解析非法参数时提前退出) - 响应头中出现
X-Powered-By: PHP/5.4.1,但正文缺失或含二进制垃圾字节 - 同一请求重复发送时,偶发性返回正确结果(取决于 cgi 进程 fork 是否稳定)
- 服务器错误日志里出现类似
Failed to open stream: No such file or directory in Unknown on line 0—— 这往往是auto_prepend_file加载失败的残留痕迹
与 CVE-2024-4577 的根本区别在于字符编码层
PHP 5.4.1 不受 CVE-2024-4577 影响,因为它早于该漏洞披露时间(2024 年),且其 Windows 版本未启用 Best-Fit 编码转换绕过逻辑。所以你在 5.4.1 上看到的 %ADd 或软连字号(U+00AD)尝试必然失败 —— 它只认原始 ASCII 短横线 -。
- 所有绕过尝试若依赖
%AD、%A0、%FF等非标准破折号变体,在 5.4.1 中均无效 - 若观察到请求中使用了这类编码却仍返回异常响应,大概率是误判或服务端混用了其他 CGI 组件(如 Perl/Python 脚本)
- 5.4.1 的修复仅靠升级无法解决:它本身已停止维护,补丁从未回推;唯一可靠缓解是禁用 CGI 模式,改用
mod_php或php-fpm
真正容易被忽略的是:这个漏洞不依赖 PHP 代码是否存在 eval 或 system,只要 php-cgi 以 CGI 方式暴露在 Web 路径下(例如 Apache 的 ScriptAlias /cgi-bin/ "C:/php/"),且未设置 cgi.force_redirect = 1 或未限制 QUERY_STRING,就等于把命令行开关直接焊在了 HTTP 接口上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











