文件解析漏洞
导语
文件解析漏洞主要由于网站管理员操作不当或者 Web 服务器自身的漏洞,导致一些特殊文件被 IIS、apache、nginx 或其他 Web服务器在某种情况下解释成脚本文件执行。大部分归因于web服务器自身漏洞。
IIS
目录解析漏洞
在 IIS5.x/6.0 中,如果有一个文件夹 以*.asp、*.asa、*.cer、*.cdx结尾,那么存在这个文件夹中的所有文件都会被IIS当做.asp执行。
比如,smartpillar.xyz的网站根目录有一个文件夹叫做test.asp,而文件夹里有一个一句话木马改后缀为.jpg的文件hack.jpg,当我们在访问smartpillar.xyz/test.asp/hack.jpg时,就相当于访问了hack.asp
文件名解析漏洞
在 IIS5.x/6.0 中,分号后面的不被解析。利用这个漏洞,黑客就可以绕过一些过滤直接上传木马。
比如当我们向服务器中传送hack.php;.jpg时,就可以绕过简单的后缀名过滤,而在服务器内部,hack.php;.jpg其实就是hack.php。
畸形解析漏洞
微软发布了IIS7.0修补了IIS6.0的解析漏洞,没想到IIS7.0爆出更严重的畸形解析漏洞。
在 IIS7.0中,在默认Fast-CGI开启状况下,假如我们有一个改后缀的马test.jpg在已知位置为smartpillar.xyz/upload/test.jpg,我们只需要访问smartpillar.xyz/upload/test.jpg/x.php即可让服务器将test.jpg当做php执行,与Nginx的一些版本的畸形解析漏洞很相似。
其他解析漏洞
因为windows系统中不允许文件的结尾是.或者空格,如果这样命名的话,windows会自动的删去那个.或者空格,黑客可以利用抓包上传结尾为.或者空格的文件来绕过文件过滤。
Nginx
畸形解析漏洞
php的配置文件 php.ini 文件中开启了 cgi.fix_pathinfo,而/etc/php5/fpm/pool.d/www.conf 中不正确的配置security.limit_extensions,导致允许将其他格式文件作为php解析执行
例如,我们有一个改后缀马在test.jpg在已知位置为smartpillar.xyz/upload/test.jpg,这时我们去访问smartpillar.xyz/upload/test.jpg/test.php(test.php可以换成任何一个不存在的文件,只要后缀是你想要的),Nginx就会将test.jpg当做php去执行。
原因在于,Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php 后,一看后缀是.php,便认为该文件是php文件,于是转交给php去处理。php一看 /test.jpg/test.php 不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件
这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项有什么用呢?看名字就知道是对文件路径进行处理。举个例子,当 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/ccc.zzz ,若 /aaa.xxx/bbb.yyy 仍不存在,则继续去掉 /bbb.yyy ,以此类推。
为何是Nginx中的php才会有这一问题呢?因为Nginx只要一看URL中路径名以.php结尾,便不管该文件是否存在,直接交给php处理。而如Apache等,会先看该文件是否存在,若存在则再决定该如何处理。cgi.fix_pathinfo是php具有的,若在php前便已正确判断了文件是否存在,cgi.fix_pathinfo便派不上用场了,这一问题自然也就不存在了。
%00空字节代码解析漏洞
Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码
影响版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
因为Nginx在拿到一个URI时,会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而$fastcgi_script_name是直接由URI环境变量控制的。
例如在访问smartpillar.xyz/upload/hack.jpg/%00.php的时候将会得到一个URI/hack.jpg/%00.php
在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为/upload/%00.php,所以不存在此问题。
而在Nginx,后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME为/upload/hack.jpg,PATH_INFO为%00.php,即会去执行hack.jpg。
CVE-2013-4547(%20%00)
影响nginx版本:nginx 0.8.41 ~ 1.5.6
这一漏洞的原理是非法字符空格(%20)和截止符(\0)(%00)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制。
例如,我们有一个改后缀马在hack.jpg 注意文件名的最后一个字符是空格,在已知位置为smartpillar.xyz/upload/hack.jpg
当我们访问smartpillar.xyz/hack.jpg%20(空格)%00(\0).php时,就会让服务器以为hack.jpg是php文件。
Apache
文件名解析漏洞
apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断。比如 xie.php.owf.rar.owf和.rar 这两种后缀是apache不可识别的解析,apache就会把xie.php.owf.rar解析成 xie.php。
罕见后缀
不仅php,就连phtml、pht、php3、php4和php5都是Apache和php认可的php程序的文件后缀。还记得正则表达式”.+.ph(p[345]?|t|tml)$”吗。有些网站管理员对此不了解,在写后缀名过滤时候过滤不理想,因此黑客可以把会被过滤的hack.php改为hack.phtml,而Apache依旧会那他当php执行。
.htaccess
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。
.htaccess 文件生效前提条件为:mod_rewrite 模块开启且AllowOverride All
有如下两种配置会导致问题
1:的意思就是把所有名字里面含有shell的文件当成php脚本来执行
<FilesMatch "shell"> |
2:可以让 .jpg后缀名文件格式的文件名以php格式解析
AddType application/x-httpd-php .jpg |
参考:
https://www.cnblogs.com/vege/p/12444476.html
http://blog.sina.com.cn/s/blog_7f1737720101e3pb.html