结论:cve-2024-4577是windows特定代码页(936/950/932)下php-cgi因best-fit字符转换导致的参数注入漏洞,影响php 8.1.

直接说结论:不要自己写扫描脚本去探测 CVE-2024-4577(PHP CGI 参数注入),尤其是针对 php-cgi.exe 的远程探测。这不是技术能力问题,而是风险控制问题——一次误判或超限请求就可能触发真实 RCE、删日志、反弹 shell,甚至被反制。
如果你是运维/安全人员需确认资产是否受影响,请优先走「配置核查 + 版本比对」路径,而非主动发恶意载荷。
怎么判断服务器是否运行易受攻击的 PHP-CGI 配置
这个漏洞不是“PHP 本身有 bug”,而是特定环境组合下才成立:
-
Windows系统(非 Linux/macOS) - 使用了简体中文(936)、繁体中文(950)或日文(932)等含 Best-Fit 编码转换的代码页
- PHP 以 CGI 模式暴露(不是 mod_php 或 FPM)
- PHP 版本在受影响范围内:
8.1.28属于8.1.,<strong>明确受影响</strong>
验证方式如下:
- 查看服务器 HTTP 响应头是否有
X-Powered-By: PHP/8.1.28(不一定可靠,可被伪造) - 检查 Web 服务器配置文件:
- Apache:
httpd.conf或.htaccess中是否存在Action application/x-httpd-php-cgi或ScriptAlias /cgi-bin/ "C:/xampp/php/" - IIS:检查是否启用了 CGI 模块,并将
.php映射到php-cgi.exe
- Apache:
- 登录服务器后执行:
chcp,输出若为936、950、932等即满足编码条件
为什么不能用 curl / python 发送 %ADd 测试请求
你在网上看到的 POC 形如:
POST /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0 HTTP/1.1 Content-Type: application/x-www-form-urlencoded
这类请求一旦成功,会直接执行 php://input 内容,等价于:
- 攻击者可任意写入 PHP 代码(比如
<?php system('whoami'); ?>) - 可立即删除 Apache 日志:
<?php unlink('../logs/access.log'); ?> - 不需要认证、不依赖 session,零点击即可 RCE
所以:
- 自动化扫描器若未做白名单限制,极易误伤生产系统
- 多数 WAF/IDS 会将
%AD视为高危特征并拦截或告警,反而暴露扫描行为 - 如果目标已打补丁但 CGI 配置仍存在,某些畸形请求还可能触发 crash(PHP 8.1.28 无对应修复)
如何安全地批量确认资产风险(不发 payload)
只做三件事,全部本地或离线完成:
- 提取所有疑似 Windows PHP 主机的响应头(
Server、X-Powered-By),过滤出含PHP/8.1.2[0-8]的记录 - 结合资产管理系统或 CMDB,确认其 Web 服务类型(Apache/IIS)和部署方式(XAMPP/WAMP/自编译 CGI)
- 对确认是 Windows + CGI + PHP 8.1.28 的机器,直接升级到 8.1.29+,或临时禁用 CGI 模式(改用
mod_php或php-fpm)
升级命令示例(XAMPP):
# 下载新版 XAMPP(含 PHP 8.1.29+),停止服务后替换 php/ 目录 # 或手动替换 php-cgi.exe 并确保 chcp 输出不变(避免回退到旧编码页)
注意:php.ini 中的 cgi.force_redirect = 0 不是漏洞成因,只是攻击链中一个辅助条件;真正绕过防护的是 Windows 的 %AD → - 字符转换。
关键点容易被忽略:
这个漏洞的触发不依赖 PHP 配置项是否开启,而取决于 Windows 系统级编码行为 + CGI 启动方式 + 特定版本 PHP 对参数解析的实现缺陷。哪怕你把 allow_url_include 设为 Off,只要 CGI 进程启动时被注入了 -d allow_url_include=1,它就生效。所以别信“我关了就不怕”——得换版本或换运行模式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











