apache文件解析漏洞
环境介绍Apache文件解析漏洞与用户的配置有密切关系。严格来说,属于用户配置问题,这里要讲解配置出错的原因以及修复方法,所以需要准备漏洞复现环境。使用ubuntu的docker准备实验拉取ubuntu镜像以及更新源docker pull ubuntu:18.04//拉取ubuntu镜像docker run --name apachejs -itd -p 80:80 ubuntu:18.04//启
环境介绍
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>
更多推荐
所有评论(0)