PHP-CGI若以CGI模式暴露在Web路径下(如/cgi-bin/php-cgi),且cgi.force_redirect=0,则可被利用CVE-2012-1823通过?-d参数执行任意代码,典型特征为请求含%2Dd、allow_url_include、php://input等组合。

检查 php-cgi 是否以 CGI 模式暴露在 Web 可访问路径下
PHP 5.3.11 自带的 php-cgi 二进制文件若被直接通过 HTTP 请求调用(如 /cgi-bin/php-cgi 或 /php-cgi/php-cgi),就可能触发 CVE-2012-1823 —— 这是该版本最典型的远程代码执行漏洞。它不依赖 PHP 配置,只要 CGI 接口可被外部请求访问且未禁用 -d 参数,攻击者就能构造类似 ?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input 的请求执行任意代码。
实操建议:
- 用 curl 手动探测常见路径:
curl -v http://target/cgi-bin/php-cgi?%2Dd+help,如果返回 PHP CLI 帮助信息(含 “Usage: php [options]”),说明 CGI 接口存活且未过滤参数 - 重点检查 Web 日志中是否出现含
?-d、%2Dd、auto_prepend_file、php://input、data://的 GET 请求,尤其是 404 响应后紧跟 200 的异常组合 - 注意 Nginx + php-cgi 组合中,若配置了
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;但未限制SCRIPT_NAME,攻击者可能通过/index.php/xxx?-d...方式绕过路径校验
查看 Web 服务器访问日志中的可疑参数组合
该漏洞利用必然携带特定参数模式,不是随机字符串。真实攻击流量通常包含以下特征之一或多个组合:
-
?-d+allow_url_include%3d1(URL 编码后的-d allow_url_include=1) -
?-d+auto_prepend_file%3dphp://input或data://text/plain,<?php phpinfo();?> - 请求体(POST body)中存在完整 PHP 代码,且 Content-Type 为
application/x-www-form-urlencoded或空,而非 multipart/form-data - 同一 IP 在短时间内对多个不同路径发起带
-d的请求(如扫描式探测)
注意:部分 WAF 或 Nginx 配置会重写或截断 ? 后参数,导致日志里只看到 /php-cgi,但响应体已执行代码——此时需结合响应长度突增、非预期的 phpinfo() 输出或 500 错误堆栈来交叉判断。
立即学习“PHP免费学习笔记(深入)”;
确认 PHP 配置中 cgi.force_redirect 是否为 0
这是决定漏洞能否实际触发的关键开关。默认情况下,PHP 5.3.11 的 php.ini 中 cgi.force_redirect = 1,此时即使 CGI 接口暴露,也会强制跳转或拒绝非合法父进程调用的请求;但一旦被设为 0,php-cgi 就完全失去保护屏障。
验证方式:
- 若能访问
phpinfo()页面,搜索cgi.force_redirect,值为Off或0即高危 - 若无法访问 phpinfo,可在疑似被利用的请求响应中尝试注入
?-d+display_errors%3d1+-d+error_reporting%3d30719+-d+auto_prepend_file%3dphp://input,然后 POST 一段<?php echo 'test';?>,看是否回显 —— 成功即证明cgi.force_redirect=0已生效 - 注意:某些定制编译的 php-cgi 会静态关闭此选项,不读取 php.ini,此时仅靠日志和行为分析更可靠
排查临时文件与 Webshell 痕迹
成功利用后,攻击者常通过 php://input 或 data:// 写入一句话木马,或直接执行命令生成临时文件。重点检查:
- Web 目录下是否有无扩展名、或以
.php5、.phtml、.phps结尾的可疑小文件(内容为<?php @eval($_POST[...])) -
/tmp或/var/tmp下是否存在以php开头、权限为 644 的临时文件(如phpXXXXXX),用file命令确认是否为 ASCII text - 检查
access.log中是否有大量POST /xxx.php HTTP/1.1且响应体为短字符串(如1、ok、空)的记录,这很可能是蚁剑/冰蝎的心跳探测
真正难发现的是内存型利用——不落盘、仅通过 php://input 动态执行,这种只能靠网络流量还原或进程行为监控(如 strace -p $(pgrep php-cgi) 抓系统调用)来确认。日常运维中,最有效的防线其实是不让 php-cgi 出现在任何 Web 可达路径里。



















