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
1.png

这里的意思是如果请求的文件名满足这个正则表达式(文件的最后一个后缀是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。


Apache解析漏洞_第1张图片
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,写好正则,就不会有问题。


SetHandler application/x-httpd-php

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


Require all denied

你可能感兴趣的:(Apache解析漏洞)