
CVE-2012-1823 - PHP CGI Argument Injection Remote Code Execution (RCE)
严重性: 严重 (CVSS 9.8)
CVE: CVE-2012-1823
发布时间: 2012年5月11日
受影响软件: 以 CGI 模式运行的 PHP (php-cgi)
漏洞类型: 参数注入 / 远程代码执行 (RCE)
攻击向量: 网络
是否需要认证: 否
CVE-2012-1823 是 PHP 历史上发现的最重要的远程代码执行漏洞之一。该漏洞影响配置为通过通用网关接口 (CGI) 执行的 PHP 安装,允许未经认证的攻击者远程执行任意 PHP 代码。
与需要 Web 应用程序内部存在缺陷的漏洞不同,此问题存在于 PHP 本身在使用 php-cgi 时。由于漏洞存在于解释器层面,受影响服务器上托管的每个 PHP 应用程序都会变得易受攻击,无论该应用程序是否包含编码缺陷。
该漏洞因其简单性、可靠性以及在互联网上的广泛利用而在 2012 年受到高度关注。即使在披露多年后,互联网范围的扫描仍持续发现易受攻击的系统,并且该漏洞仍然被包含在利用框架和防御检测工具中。
该漏洞存在于 PHP 的 CGI 实现 (php-cgi) 中。
通常,HTTP 查询参数旨在作为用户输入传递给 PHP 脚本。
然而,PHP 错误地处理了不包含等号 (=) 字符的特制查询字符串。
PHP 并没有将查询字符串纯粹视为用户数据,而是错误地将其部分内容解析为直接传递给 PHP 可执行文件的命令行参数。
由于 PHP 支持大量命令行开关(例如 -d),攻击者可以在请求处理过程中覆盖 PHP 运行时配置选项。
这使得攻击者能够:
根本原因在于 php_getopt() 在以下代码中的处理不当:
sapi/cgi/cgi_main.c
具体来说,PHP 在处理缺少等号 (=) 的恶意查询字符串时,未能正确忽略命令行解析。
CGI 可执行文件接受命令行参数。
例如:
php-cgi -d allow_url_include=1
通常这些参数只应来自操作系统。
相反,PHP 错误地允许 HTTP 请求通过特制 URL 注入这些参数。
因此,攻击者可以在目标脚本执行之前操纵 PHP 运行时配置。
这有效地将一个简单的 HTTP 请求转化为针对 php-cgi 的命令行执行。
以下 PHP 版本易受攻击:
| 版本 | 状态 |
|---|---|
| PHP < 5.3.12 | 易受攻击 |
| PHP 5.4.x < 5.4.2 | 易受攻击 |
只有使用 CGI 模式 (php-cgi) 的安装受到影响。
以以下方式运行的 PHP:
通常不受 CVE-2012-1823 本身的影响。
攻击者只需要:
该漏洞可完全远程利用。
攻击通常遵循以下阶段:
一旦获得代码执行,攻击者通常会:
成功利用会导致 PHP 应用程序完全被攻陷。
潜在后果包括:
如果 PHP 以提升的权限执行,也可能导致系统级入侵。
几个特点使得 CVE-2012-1823 特别具有影响力:
其易于利用与严重影响相结合,导致了大规模的现实世界攻击,并且被列入 CISA 的已知被利用漏洞 (KEV) 目录。
管理员应检查:
指标包括:
安全扫描工具,如 Nuclei、Nessus、OpenVAS 和 Metasploit 模块,可以检测易受攻击的配置。
建议的缓解措施包括:
| 日期 |
|---|
本仓库仅供教育目的、安全研究、漏洞分析和防御测试使用。此处包含的任何信息仅应用于您拥有明确授权的系统。未经授权利用易受攻击的系统是非法且不道德的。
| 指标 | 值 |
|---|
| 基础分 | 9.8 |
| 严重性 | 严重 |
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 机密性 | 高 |
| 完整性 | 高 |
| 可用性 | 高 |
| 事件 |
|---|
| 2012年5月 | 漏洞公开披露 |
| 2012年5月 | 发布安全补丁 |
| 2012年 | 发布公开利用代码 |
| 2012年 | Metasploit 模块发布 |
| 随后几年 | 观察到大规模互联网利用 |
| 至今 | 仍在漏洞扫描和遗留系统中出现 |