文件解析漏洞原理
文件解析漏洞主要是由于网站管理者操作不当或者web服务器自身的漏洞,导致一些特殊文件被IIS,apache,nginx或者其他web服务器在某种情况下解析成脚本文件去执行。
文件解析漏洞分类
IIS解析漏洞
目录解析漏洞(test.asp/1.jpg)
在IIS5.x/6.0中,网站下创建的名为*.asp,*.asa,*.cer,*.cdx的文件夹,而这些文件夹中的任何拓展名的文件都会被IIS当作asp文件来解析并执行。
文件名解析漏洞(test.asp;jpg)
在IIS5.x/6.0中,分号后面的不被解析,也就是test.asp;.jpg会被服务器当作test.asp。IIS6.0默认的可执行文件除了asp还有test.asa和test.cer两种后缀的文件。同样可以使用test.asa;.jpg和test.cer;.jpg进行上传解析。
畸形解析漏洞(test.jpg/*.php)
IIS7.0中,在默认Fast-CGI开启的情况下,我们向图片中写入如下的代码
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[a])?>')?>
将文件保存为test.jpg,上传到服务器,假设上传路径为/upload,上传成功后,直接访问/upload/test.jpg/a.php,test.jpg将会被服务器当成php文件执行,所以图片中的代码就会执行创建shell.php并写入<?php @eval($_POST[a]);?>
临时解决办法:设置cgi.fix_pathinfo为0
Nginx解析漏洞
畸形解析漏洞(test.jpg/*.php)
漏洞原因:
php的配置文件php.ini文件中开启了cgi.fix_pathinfo
/etc/php5/fpm/pool.d/www.conf中不正确的配置security.limit_extensions,导致允许将其他格式的文件当作php解析执行
新建一个文件,内容为:<?php phpinfo();?>,然后将其命名为test.jpg,在浏览器中访问http://127.0.0.1/test.jpg显示图片解析错误;访问http:.//127.0.0.1/test.jpg/test.php,显示:Access denid.。test.jpg时文件不是文件夹,test.php也根本就是不存在的文件,访问http://127.0.0.1/test.jpg/test.php没有报404,而是显示Access denid,原因在于,Nginx在拿到/test.jpg/test.php后,一看后缀是.php,于是认为该文件是php文件,交给php引擎去处理。For example:当php引擎遇到文件路径为/aaa.xxx/bbb.yyy/ccc.zzz时,若/aaa.xxx/bbb.yyy/ccc.zzz不存在,则会去掉最后的/ccc.zzz,然后判断/aaa.xxx/bbb.yyy是否存在,以此类推,直到找出存在的文件如(/aaa.xxx/bbb.yyy),将/aaa.xxx/bbb.yyy当作文件/aaa.xxx/bbb.yyy/ccc.zzz。目前我们还是没有成功执行代码,test.jpg并没有怕被当做php文件执行,是因为新版本php引入了security.limit_extensions,限制可执行文件的后缀名,默认情况只允许执行.php格式的文件
Nginx和IIS解析php文件时,不管文件存在与否,就直接交给php引擎处理,而apache服务器解析之前会判断文件是否存在。
%00空字节代码解析漏洞
Nginx遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中插入php代码,通过访问test.jpg%00.php来执行其中的代码
Nginx0.5.*,Nginx0.6.*,Nginx0.7<=0.7.65,Nginx0.8<=0.8.37
CVE-2013-4547(%20%00)
影响Nginx版本:0.8.41~1.5.6
漏洞原理:
非法空字符和截止符(%00)会使得Nginx解析url时的有机制发生混乱,允许攻击者通过一个非编码空格绕过后缀名限制,假如服务器上有个文件:"test.jpg ",jpg后缀后面有空格,则可以通过http://127.0.0.1/test.jpg \0.php,让Nginx认为文件"test.jpg "的后缀为.php
Apache解析漏洞
文件名解析漏洞
apache解析文件的顺序是从右到左,如果不能解析,就往左继续判断。
.htaccess文件
.htaccess文件时apache中的一个配置文件,负责相关目录下的网页配置,通过.htaccess文件,可以实现:
网页301重定向,自定义404错误页面,改变文件拓展名,允许或阻止特定用户/目录访问,禁止目录列表,配置默认文档等。该文件默认开启,启用和关闭在httpd.conf中进行配置。
.htaccess文件生效前提:
mod_rewrite模块开启
AllowOverride All
#把所有名字包含test的文件当作php脚本执行
<FileMatch "test">
SetHandler application/x-httpd-php
</FileMatch>
#让.jpg格式文件以php格式解析
AddType application/x-httpd-php .jpg