PHP-CGI远程代码执行漏洞(CVE-2012-1823)漏洞复现

影响版本: php < 5.3.12 or php < 5.4.2

cgi、fastcgi、fpm

下载PHP源码,可以看到其中有个目录叫sapi。sapi在PHP中的作用,类似于一个消息的“传递者”

最常见的sapi应该是用于Apache的mod_php,这个sapi用于php和apache之间的数据交换

php-cgi也是一个sapi。在远古的时候,web应用的运行方式很简单,web容器接收到http数据包后,拿到用户请求的文件(cgi脚本),并fork出一个子进程(解释器)去执行这个文件,然后拿到执行结果,直接返回给用户,同时这个解释器子进程也就结束了。基于bash、perl等语言的web应用多半都是以这种方式来执行,这种执行方式一般就被称为cgi,在安装Apache的时候默认有一个cgi-bin目录,最早就是放置这些cgi脚本用的。

但cgi模式有个致命的缺点,众所周知,进程的创建和调度都是有一定消耗的,而且进程的数量也不是无限的。所以,基于cgi模式运行的网站通常不能同时接受大量请求,否则每个请求生成一个子进程,就有可能把服务器挤爆。于是后来就有了fastcgi,fastcgi进程可以将自己一直运行在后台,并通过fastcgi协议接受数据包,执行后返回结果,但自身并不退出。

php有一个叫php-cgi的sapi,php-cgi有两个功能,一是提供cgi方式的交互,二是提供fastcgi方式的交互。也就说,我们可以像perl一样,让web容器直接fork一个php-cgi进程执行某脚本;也可以在后台运行php-cgi -b 127.0.0.1:9000(php-cgi作为fastcgi的管理器),并让web容器用fastcgi协议和9000交互。

为什么php有两个fastcgi管理器?php确实有两个fastcgi管理器,php-cgi可以以fastcgi模式运行,fpm也是以fastcgi模式运行。但fpm是php在5.3版本以后引入的,是一个更高效的fastcgi管理器

简单理解PHP拥有两个sapicgifastcgi,其中fpm就是fastcgi下的一种运行方式,是一个更高效的fastcgi运行管理方式

漏洞原理

CVE-2012-1823就是php-cgi这个sapi出现的漏洞,上面介绍了php-cgi提供的两种运行方式:cgi和fastcgi,本漏洞只出现在以cgi模式运行的php中。

这个漏洞简单来说,就是用户请求的querystring被作为了php-cgi的参数,最终导致了一系列结果

漏洞利用

发现cgi模式下有如下一些参数可用:

  • -c 指定php.ini文件的位置
  • -n 不要加载php.ini文件
  • -d 指定配置项
  • -b 启动fastcgi进程
  • -s 显示文件源码
  • -T 执行指定次该文件
  • -h和-? 显示帮助
  1. 这里我们先启动vulhub的靶机环境
cd /vulhub/php/CVE-2012-1823
sudo docker-compose up -d


  1. 最简单的利用方式,当然就是-s,可以直接显示源码:

  2. 一个更好的利用方法:通过使用-d指定auto_prepend_file来制造任意文件包含漏洞,执行任意代码:

-d allow_url_include=on -d auto_prepend_file=php://input

使用-d参数可以配合php.ini中的配置文件

  • allow_url_include: 允许包含远程机器的文件
  • auto_prepend_file: 页面顶部加载的内容
  • auto_append_file: 页面底部加载的内容
  • php://input: 通过POST方式提交数据,这里运用的很巧妙,使用post方式提交需要包含的PHP代码


成功利用
其他的操作,例如命令执行

这里也可以直接执行PHP代码,后续可以很多操作,例如如下思路

  • 通过shell_execsystem()或者其他命令执行函数命令执行
  • 通过命令执行执行wget下载本机的reverse.php
  • 使用PHP代码生成一句话木马

通过/proc/self/environ本地文件包含

修改User-Agent为PHP代码,查看HTTP_USER_AGENT

posted @ 2024-04-06 15:10  Junglezt  阅读(490)  评论(0编辑  收藏  举报