
Apache文件解析漏洞与用户的配置有密切关系。严格来说,属于用户配置问题,这里要讲解配置出错的原因以及修复方法,所以需要准备漏洞复现环境。
使用ubuntu的docker。然后运行以下命令即可:
apt-get install apache2
apt-get install php7.0
apt-get install libapache2-mod-php7.0Apache文件解析漏洞就发生在Module结合方法上,也就是我们之前配置apt-get install libapache2-mod-php7.0
查看Apache和php的结合方法:

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

这里记录了大量的文件后缀和mime类型,当客户端请求一个文件时,如果后缀在这个列表里,那么apache就返回对应的content-type给浏览器.如果不在列表,apache不会返回content-type给浏览器,而直接文件内容,由浏览器自动处理。
cat /etc/mime.types | grep php
这里关于php的全部都被注释掉了
/etc/apache2/mods-enabled/php7.2.conf
意思是如果请求的文件名匹配正则:+.ph(p3457?|t|tml)$
也就是说(php|php3|php4|php5|php7|pht|phtml)是文件的最后一个后缀,则把文件交给php处理器(php_module)来处理,处理完之后结果返回给apache,再由apache发送给浏览器。
Apache文件解析漏洞涉及到一个解析文件的特性:
Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.types内),则继续向左识别。
当我们请求这样一个文件:shell.php.xxx.yyy
yyy->无法识别,向左
xxx->无法识别,向左
php->发现后缀是php,交给php处理这个文件
比如,在web目录下创建一个1.php.aaa,然后访问该文件:


可以看到并没有解析成PHP,那为什么呢?其实,apache本身根本不存在所谓的解析漏洞
我们回顾一下请求的过程:
当我们请求这样一个文件:shel.php.xxx.yyy
yyy->无法识别,向左
xxx->无法识别,向左
php->发现后缀是php,交给php处理这个文件
最后一步虽然交给了php来处理这个文件,但是php也不认识.aaa的后缀啊,所以就直接输出了
其实,解析漏洞的产生,是由于运维人员在配置服务器时,为了使apache服务器能解析php,而自己添加一个handler,例如:

它的作用也是为了让apache把php文件交给php_module解析,但是注意到它与SetHandler:它的后缀不是用正则去匹配的。所以,在文件名的任何位置匹配到php后缀,它都会让php_module解析。
现在,访问1.php.xxx.yyy之后解析的流程是这样的:
yyy ->无法识别,向左
XXX ->无法识别,向左
php->激活php处理器,执行PHP代码
解析漏洞就产生了
现在,访问1.php.aaa,可以看到解析成功。

不要使用AddHandler,改用SetHandler,写好正则,就不会有解析问题

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

本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!
本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。