环境介绍

Apache文件解析漏洞与用户的配置有密切关系。严格来说,属于用户配置问题,这里要讲解配置出错的原因以及修复方法,所以需要准备漏洞复现环境。

使用ubuntu的docker准备实验

拉取ubuntu镜像以及更新源

docker pull ubuntu:18.04    //拉取ubuntu镜像
docker run --name apachejs -itd -p 80:80 ubuntu:18.04    //启动镜像
docker ps    //查看已开启容器信息
docker exec -it [容器ID] /bin/bash    //进入容器
apt-get update    //更新源
apt-get install vim    //安装vim

然后再进行更新源

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

源文件sources.list在根目录etc/apt/下通过命令编辑sources.list

vim /etc/apt/sources.list    //打开源文件
最后加载更新源与软件
apt-get update  
apt-get upgrade

安装apache php 结合

apt-get install apache2    //安装apache
apt-get install php7.0    //安装php7.0
apt-get install php-pear
apt-get install libapache2-mod-php7.0    //将apache与php7.0结合

如果在结合过程中,出现以下报错

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package libapache2-mod-php7.0
E: Couldn't find any package by glob 'libapache2-mod-php7.0'
E: Couldn't find any package by regex 'libapache2-mod-php7.0'

可添加以下第三方存储

apt-get install software-properties-common
add-apt-repository ppa:ondrej/php

然后更新并升级后再次结合

apt update

启动apache

service apache2 start

Apache和php三种结合方法

  • CGI:通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口,让Web服务器必要时启动额外的程序处理动态内容。
  • FastCGI:CGI解释器的更快实现,可以提供良好的性能、伸缩性、Fail-Over特性等等。
  • Module:把php编译为apache的模块,也是用的最多的一种方法。

Apache文件解析漏洞就发生在Module结合方法上,也就是我们之前配置apt-get install libapache2-mod-php7.0

查看Apache和php三种结合方法

apachectl -M | grep php

 Apache解析文件方法

一个重要文件 /etc/mime.types

这里记录了大量的文件后缀和mime类型,当客户端请求一个文件时,如果后缀在这个列表里,那么apache就返回对应的content-type给浏览器.如果不在列表,apache不会返回content-type给浏览器,而直接文件内容,由浏览器自动处理。

cat /etc/mime.types | grep php

这里关于php的全部被注释掉了

/etc/apache2/mods-enabled/php7.0.conf

意思是如果请求的文件名匹配正则:+\.ph(p[3457]?|t|tml)$

也就是说(php|php3|php4|php5|php7|pht|phyml)是文件的最后一个后缀,则把文件交给php处理器(php_module)来处理,处理完之后结果返回给apache,再由apache发送给浏览器。

漏洞原理 

Apache文件解析漏洞涉及到一个解析文件的特性:
Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.types内),则继续向左识别。
当我们请求这样一个文件:shell.php.xxx.yyy
yyy ->无法识别,向左
XXX ->无法识别,向左
php -> 发现后缀是php,交给php处理这个文件

在web目录下创建一个1.php.aaa,然后访问该文件

 可以看到并没有解析成PHP,其实apache本身根本不存在所谓的解析漏洞
我们回顾一下请求的过程:
当我们请求这样一个文件:shell.php.xxx.yyy
yyy-> 无法识别,向左
XXX -> 无法识别,向左
php -> 发现后缀是php,交给php处理这个文件
最后一步虽然交给了php来处理这个文件,但是php也不认识.aaa的后缀,所以就直接输出了。

其实,解析漏洞的产生,是由于运维人员在配置服务器时,为了使apache服务器能解析php,而自己添加一个handler,例如:

 AddHandler application/x-httpd-php .php

它的作用也是为了让apache把php文件交给php_module解析,但是注意到它与SetHandler:它的后缀不是用正则去匹配的。所以,在文件名的任何位置匹配到php后缀,它都会让php_module解析。

现在,访问1.php.xxx.yyy之后解析的流程是这样的:
yyy ->无法识别,向左
XXX ->无法识别,向左
php - > 激活php处理器,执行PHP代码
解析漏洞就产生了。

echo "AddHandler application/x-httpd-php .php" > /etc/apache2/sites-enabled/bbs.conf

 现在重启一下apache服务,重新加载一下配置

service apache2 restart

 漏洞修复:

不要使用AddHandler,改用SetHandler,写好正则,就不会有解析问题,
删除掉之配置的AddHandler 

rm /etc/apache2/sites-enabled/bbs.conf
<FilesMatch ".+\.php$">
SetHandler application/x-httpd-php
</FilesMatch>

禁止.php.这样的文件执行

<FilesMatch ".+\.ph(p[3457]?|t|tml)\.">
Require all denied
</FilesMatch>
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐