一、什么是文件解析?
当服务器接收到一个HTTP请求的时候,web容器(如IIS、Apache)首先会根据文件的后缀名,来决定如何去处理这个请求。
当服务器获取到所请求的页面的后缀(如.php)后,接下来就会在服务器端寻找可以处理这类后缀名的应用程序,如果找不到则直接把这个文件返还给客户端。
二、Apache 解析漏洞
(1)漏洞原理
该解析漏洞属于用户配置问题,且Apache与php的结合方式为Module,如下:
首先要明确一点,Apache对文件的解析顺序是从右往左的,直到遇见一个Apache可以解析的文件后缀为止。
例如访问/test.php.aaa.bbb,由于Apache不认识aaa和bbb,会从右往左一直遍历到后缀.php为止。
文件 /etc/mime.types,记录了大量Apache可以解析的文件类型。
上图php类型都被注释掉了,不可以解析。因此,还有另外一个文件/etc/apache2/mods-enabled/php.config
通过正则的方式记录了可以交给php解析的文件类型,上图可以解析.php文件。
提问:访问index.php.aaa是否可以顺利解析?
答案是不可以的,初始情况下Apache是不存在这个漏洞的,从右往左识别到.php后,服务器将index.php.aaa整体交给php来处理,但php并不认识.aaa,所以无法解析。
该漏洞产生的原因是,运维人员在配置服务器时,为了使服务器能够解析.php,自己添加了一个handler,到/etc/apache2/sites-enabled/目录下。
我们在该目录下添加的任意名称的配置文件都会生效,例如创建一个1.conf,内容为:
AddHandler不同于SetHandler,只要文件名中的任何位置有.php,就会被交给php_module解析,而SetHandler只会解析后缀为.php的文件。
(2)防护方法
在配置文件中,使用SetHandler配合正则表达式的方法,而不是AddHandler,这样就不会出现解析问题了。
三、IIS
1、IIS 6.0 解析漏洞
(1)利用特殊符号“;”
在IIS 6.0版本中,“;”号的功能类似于%00截断,例如我们上传一个恶意脚本“yijuhua.asp;.jpg”,文件后缀为jpg,可以绕过服务器检测,当我们访问这个文件时,分号后面的内容会被截断,就相当于我们访问的是yijuhua.asp。
(2)文件夹命名为.asp
如果一个目录以“xxx.asp”的格式命名,那么该目录下的所有类型的文件都会被当作asp文件来解析执行。例如:
(3)修复方法:
以上两个IIS解析漏洞,微软认为是IIS的正常功能,因此未提供修复补丁。防护方案:
- 升级IIS到更高级的版本
- 对上传的文件做严格的过滤,避免上传不合规的文件。
2、IIS 7.5解析漏洞
(1)漏洞原理
当IIS 7.5在Fast-CGI运行模式下时,如果服务器开启了“cgi.fix_pathinfo”功能,且去掉了php-cgi.exe程序的“Invoke handler only if request is mapped to”勾选。那么当访问的文件路径不存在时,会对路径进行修剪。
例如test.jpg是我们上传的图片马,直接访问/test.jpg无法被php解析。
但是利用路径修剪功能,我们可以访问 /webshell.jpg/.php,服务器发现为.php后缀,便交给php解析。
php发现无法访问该路径后,便会对路径进行修剪,最终解析的是test.jpg文件。
(2)修复方法
关闭cgi.fix_pathinfo功能即可。
3、Nginx解析漏洞
(1)Nginx初始配置
刚安装好的Nginx是无法解析php文件的。
修改/etc/nginx/sites-available/default文件的部分配置如下,以套接字方式启动:
使用php5-fpm start启动web服务后,就可以解析.php文件了:
(2)漏洞原理
对于任意文件,访问时在后面添加/任意文件名.php ,便可交给php进行解析。
和Apache一样,Nginx也是通过/etc/nginx/mine.types识别文件。
该漏洞也是配置导致的,默认不存在,需要在/etc/php5/fpm/php.ini中开启cgi.fix_pathinfo功能,该功能默认开启。
还需要配置/etc/php5/fpm/pool.d/www.conf文件,修改security.limit_extensions为空,允许解析其他格式文件为PHP,原本的配置为:
//只解析php,php3,php4,php5后缀的文件
修改为空后,会把所有后缀都以php解析。
例如1.jpg是我上传的一个图片马,利用该漏洞进行访问:
Nginx发现访问的文件为.php后缀,便交给php处理,php发现/1.jpg/1.php不存在,剪掉/1.php后缀,把1.jpg当成需要执行的文件来处理。
(3)防护方法
配置项 security.limit_extensions 不要填写为空,填写需要解析的文件后缀。
关闭 cgi.fix_pathinfo 路径修剪功能。