文章目录
一、环境简介
Apache文件解析漏洞与用户配置有密切关系。严格来说,属于用户配置问题,这里使用ubantu的docker来复现漏洞:
bash
apt-get install apache2
apt-get install php7.0
apt-get install libapache2-mod-php7.0
一、Apache与php三种结合方法
- CGI:共同网关接口,是HTTP服务器与机器上其他程序进行通信的一个接口,让web服务器必要时启动额外的程序处理动态内容。
- FastCGI:CGI解释器的更快实现,可以提供良好的性能、伸缩性等。
- Module:php作为apache的模块,也是用的最多的一种方法。
Apache文件解析漏洞就发生在Module结合方法上。
查看apache和php的结合方法:
二、Apache解析文件的方法
一个重要文件/etc/mime.types
这里记录了大量的文件后缀和mime类型,当客户端请求一个文件时,如果后缀在这个列表里,那么apache一方面返回对应的content-type给浏览器,一方面根据文件的MIME类型进行下一步处理。如果不在列表,apache不会返回content-type给浏览器,而是直接返回文件内容,由浏览器自动处理。
cat /etc/mime.types | grep php
这里注释掉关于php的全部项。例如对于第一项后缀名为
php/pht/phtml
的文件,apache将会将其给php处理器进行解析。
三、Apache解析php的方法
/etc/apache2/mods-enabled/php7.2.conf
- apache通过
/etc/mime.types
识别文件所属mime
类型,然后根据MIME类型,apache将文件交给对应的程序进行处理。- apache或者通过
/etc/apache2/mods-enabled/php7.2.conf
进行文件匹配,用SetHandler
设置请求处理程序。
如上图,如果(php|php3|php5|php7|pht|phtml)是请求文件的最后一个后缀,则把文件交给php处理器(php_module)来处理,处理完之后把结果返回给apache,再由apache发送给浏览器。
四、漏洞原理
Apache文件解析漏洞设计到一个解析文件的特性:Apache默认一个文件可以有多个以点分割的后缀,当右边的后缀无法识别(不在mime.types
内),则继续向左识别。例如,当我们请求这样一个文件:shell.php.xxx.yyy
yyy
无法被识别,向左;xxx
无法被识别,向左;php
发现后缀是php,交给php处理这个文件。
如果,apache都不认识,将把文件直接返回给客户端,也就是爆源码。
在web目录下创建一个1.php.aaa
的文件,并访问:
可以看到并没有被解析成php,为什么?
因为apache本身并不存在所谓的解析漏洞。让我们回顾解析过程:
yyy
无法被识别,向左;xxx
无法被识别,向左;php
发现后缀是php,交给php解释器处理这个文件。最后这一步虽然交给php解释器来处理这个文件,但是php解释器也不认识
.aaa
的后缀,所以就直接输出了。
其实,解析漏洞的产生,是由于运维人员在配置服务器时,为了使apapche服务器能解析php,而自己添加了一个handler
,例如:AddHandler application/x-httpd-php .php
。它的作用是为了让apache把文件交给php_module解析,就是说在文件名的任何位置匹配到php后缀,apache都会让pap_module去解析。
添加一个handler
之后,访问1.php.xxx.yyy
的解析流程是这样:
yyy
无法被识别,向左;xxx
无法被识别,向左;php
激活php处理器,执行php代码。
解析漏洞就产生了。
五、修复方法
- 不要使用AddHandle,改成SetHandler,写好正则,就不会有解析问题。
- 禁止
.php.
这样的文件执行