CVE-2024-4577影响PHP 8.1.28 Windows CGI模式,简体中文系统(代码页936)下,若php-cgi.exe被Web直接访问(如/cgi-bin/php-cgi.exe)且URL含%ADd参数,即可远程代码执行,无需日志、进程或文件痕迹。

PHP 8.1.28 在 Windows + CGI 模式下存在 CVE-2024-4577,只要系统语言是简体中文(代码页 936)、且 PHP-CGI 被暴露或配置为 handler,就极可能已被利用——不查日志、不看进程、不验文件,基本等于裸奔。
确认是否运行在危险 CGI 模式
很多管理员以为“没配 Action 就安全”,其实只要 php-cgi.exe 被 Web 可访问路径直接调用(比如 /cgi-bin/php-cgi.exe 或 /php-cgi/php-cgi.exe),就满足漏洞触发前提。
- 检查 Apache 配置中是否存在
Action、SetHandler application/x-httpd-php-cgi、ScriptAlias指向 PHP 安装目录(如ScriptAlias /php-cgi/ "C:/xampp/php/") - 用浏览器或 curl 访问类似
http://yourhost/php-cgi/php-cgi.exe?%ADd-d—— 如果返回 PHP 语法错误或空白页(而非 404/403),说明php-cgi.exe可被直接调用 - 搜索服务器磁盘:是否存在
php-cgi.exe被复制到htdocs/cgi-bin/、www/cgi-bin/等 Web 可执行目录下
查 Apache access.log 里带 %ADd 的可疑请求
CVE-2024-4577 利用必须在 URL 查询参数中注入 %ADd(0xAD 字符经 Windows Best-Fit 转为 ASCII -),这是最硬的指纹。别信“没开 POST 就没事”——GET 请求一样能 RCE。
- 用 grep 或 findstr 快速扫描:
findstr /i "%ADd" "access.log"(Windows)或grep -i "%ad[d]" access.log(Linux/WSL) - 重点匹配组合:如
%ADd+cgi.force_redirect%3d0、%ADd+allow_url_include%3d1、%ADd+auto_prepend_file%3dphp://input - 注意绕过技巧:攻击者常混用大小写、URL 编码变体(如
%ad、%AD、%aD),建议统一转小写再搜
检查 PHP 进程异常子进程与临时文件
成功利用后,攻击者通常通过 php://input 注入一句话或执行命令,不会落地 .php 文件,但会派生 shell 进程或写入临时 payload。
立即学习“PHP免费学习笔记(深入)”;
- 在任务管理器或
tasklist /m php*中观察是否有多个php-cgi.exe实例长期存活(正常 CGI 是短时进程) - 检查
%TEMP%、%SystemRoot%\Temp、Apache 日志同级目录下是否有近期生成的可疑 .php、.txt、.dat 文件,内容含<?php @eval、system(、shell_exec( - 用
netstat -ano | findstr :80查看是否有非 Apache 进程监听 80/443(可能已被反弹 shell 占用端口)
验证是否已失陷的快速手工检测
不要只依赖日志——攻击者删日志太容易。直接在服务端构造一次探测性请求,看是否还能复现漏洞行为(即确认防护是否真正生效)。
- 停掉 Apache,手动执行:
C:\xampp\php\php-cgi.exe -v—— 若输出版本号,说明二进制本身未被篡改 - 重启 Apache 后,发一个无害探测请求:
curl -X GET "http://localhost/php-cgi/php-cgi.exe?%ADd-d" -H "Content-Type: application/x-www-form-urlencoded";若返回Invalid argument或空响应,说明仍可被注入;若返回 404/403,可能是路径已禁用,但仍需结合前面三项交叉验证 - 最关键的一步:立刻升级到
PHP 8.1.29或更高(当前最新稳定版是PHP 8.4.26),仅打补丁或禁用 CGI 不够——旧版二进制里main/SAPI.c对 0x80+ 字符的校验逻辑根本不存在
真实入侵场景中,%ADd 请求往往只出现一两次,之后攻击者就静默横向移动。别等看到 webshell 才行动,看到一条匹配日志,就应该按失陷响应流程走。



















