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拥有两个sapi
:cgi
和fastcgi
,其中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和-? 显示帮助
- 这里我们先启动
vulhub
的靶机环境
cd /vulhub/php/CVE-2012-1823
sudo docker-compose up -d
-
最简单的利用方式,当然就是
-s
,可以直接显示源码:
-
一个更好的利用方法:通过使用
-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_exec
、system()
或者其他命令执行函数命令执行 - 通过命令执行执行
wget
下载本机的reverse.php
- 使用PHP代码生成一句话木马
通过/proc/self/environ本地文件包含
修改User-Agent
为PHP代码,查看HTTP_USER_AGENT
值