Apache解析漏洞
Apache解析漏洞跟IIS不一样,Apache的文件解析漏洞主要与用户的配置有密切关系,配置不当造成的。
环境准备
需要使用Ubuntu的docker,运行一下命令安装环境
1.apt-get install apache2
2.apt-get install php7.0
3.apt-get install libapache2-mod-php7.0
这里有个点就是CentOS下安装软件的命令是yum,Ubuntu是apt-get
第三条命令是指定Apache和PHP的结合方式,因为如果要启动环境的话分别启动两个太麻烦,将两者结合,只需要启动Apache就可以。
Apache和PHP三种结合方法:
1.CGI:共同网关接口,是HTTP服务器与机器上其他程序进行通信的一个借口,让WEb服务器必要时启动额外的程序处理动态内容。
2.FastCGI:CGI解释器的更快实现,可以提供良好的性能、伸缩性、Fail-Over特性等
3.Module:把PHP编译为Apache模块,也是用的最多的一种方法(这里第三条命令就是这种方法)
查看Apache和PHP的结合方法:
/usr/sbin/apachectl -M | grep php
一些配置文件的含义和作用
/etc/mime.types
这里记录了大量的文件后缀和mime类型,当客户端请求一个文件时,如果后缀在这个列表里,那么Apache就返回对应的content-type给浏览器。如果不在列表,Apache不会返回content-type给浏览器,而是直接返回文件内容,由浏览器自动处理。
2.查看Apache解析PHP的方法
cat /etc/mime.types | grep php
这里可以看到这个配置文件是注释掉了所有的关于PHP
3.真正的Apache解析PHP的方法
/etc/apache2/mods-enabled/php7.2.conf

这里的意思是如果请求的文件名满足这个正则表达式(文件的最后一个后缀是php|php3....)就把文件交给PHP处理器(php_module)来处理,处理完之后结果返回给Apache,再由Apache发送给浏览器。
4.其实Apache文件解析漏洞涉及到一个文件解析的特性:Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别(不在mime.types内),则继续向左识别。
举个栗子,如果有这么一个文件1.php.xxx.yyy,.yyy无法识别,向左,.yyy无法识别,向左,.php可以识别,交给PHP来处理这个文件(但是这里别忘记了前面那个/etc/apache2/mods-enabled/php7.2.conf文件的内容哦,是以最后一个点后缀作为文件类型的),因此这里PHP并不认识.yyy这个后缀,无法识别,所以就直接输出了代码。
5.前面说了Apache的解析漏洞是由于运维人员配置存在问题,所以这里就说到是什么配置出现问题。
解析漏洞的产生是由于运维人员在配置服务器时,为了使Apache能够解析PHP,而自己添加了一个handler。
2.png
AddHandler application/x-httpd-php .php
这句话的作用也是为了让Apache把PHP文件交给php_moudle解析,但是它与sethandler的区别是它的后缀不是用正则去匹配。所以在文件名的任何位置匹配到php后缀,他都会让php_module解析。
之前那个1.php.xxx.yyy文件就会是这样的顺序,.yyy无法识别,向左,.xxx无法识别,向左,.php可以识别,就激活php处理器,执行PHP代码,解析漏洞就产生了。
6.防御方法
运维人员正确配置文件,不要偷懒乱配置,要注意权限和范围的问题。这里就是不要使用AddHandler,改用SetHandler,写好正则,就不会有问题。
<FileMatch ".+\.php$">
SetHandler application/x-httpd-php
</FileMatch>
禁止.php.这样的文件执行
<FileMatch ".+\.ph(p[3457]?|t|tml)\.">
Require all denied
</FileMatch>