IIS文件解析漏洞
IIS(Internet Information Services)是微软出品的灵活、安全、易于管理的Web服务器。
在总结过Apache和Nginx的文件解析漏洞后,现在来总结下IIS的文件解析漏洞。
默认后缀
这其实不是文件解析漏洞,但能达到和文件解析漏洞一样的效果。IIS总是和asp联系在一起。一般而言,asp程序文件的后缀为.asp,但实际上,IIS默认地还会解析其他后缀的文件为asp文件。如下图是我在Windows7中开启IIS7.5对asp支持后处理程序映射的默认设置:
由上图可知,.cer文件和.asp文件的处理程序一样,均为IsapiModule(实际上就是aspnet_isapi.dll),故.cer文件也被当做asp程序执行。经测试,确实是这样。
网上找到的资料说.asa、.cer和.cdx都是默认被IIS6.0当做asp执行的后缀。我在Windows XP SP3 + IIS5.1和Windows Server 2003 + IIS6.0中测试发现,.asa和.cer是被当做asp执行的后缀,.cdx不行。
总结一下,可能被IIS当做asp程序执行的后缀有:
.asp
.cer
.asa
.cdx
IIS 6.0 文件解析漏洞
这个真的是漏洞,不是什么特性。测试发现,IIS5.1和IIS7.5无此漏洞。
IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:
/test.asp/test.jpg
test.asp;.jpg
第一种是新建一个名为“test.asp”的目录,该目录中的任何文件都被IIS当做asp程序执行(特殊符号是“/”);第二种是上传名为“test.asp;.jpg”的文件,虽然该文件真正的后缀名是“.jpg”,但由于含有特殊符号“;”,仍会被IIS当做asp程序执行。
漏洞原理见《IIS 文件名解析漏洞扼要分析》。该文链接可能已失效,百度文章标题,可以找到转载版本。原理大抵是IIS 5.x/6.0在从文件路径中读取文件后缀时,遇到一个“.”后,便进入了一种截断状态,在该状态下遇到特殊符号——“/”和“;”,都会进行截断,只保留特殊符号前的部分,即:“.asp”,从而认为文件后缀为“.asp”。
下图是我在Windows Server 2003 + IIS6.0中进行测试确认该漏洞存在的截图:
遇到php时文件解析问题
test.jpg/.php
IIS和Nginx在这一点上是一样的,一看到URL中文件后缀是.php,便无论该文件是否存在,都直接交给php处理,而php又默认开启“cgi.fix_pathinfo”,会对文件路径进行“修理”,何谓“修理”?举个例子,当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”,以此类推。
若有文件test.jpg,访问时在其后加/.php,便可以让IIS把“test.jpg/.php”交给php,php“修理”文件路径“test.jpg/.php”得到“test.jpg”,该文件存在,便把该文件作为php程序执行了。下图所示,是在 IIS7.5+php5.3+FastCGI 下的测试情况:
asp没有“cgi.fix_pathinfo”,所以不存在这一问题。
Windows操作系统文件命名规则
Windows操作系统中,文件名不能以空格或“.”开头,也不能以空格或“.”结尾。当把一个文件命名为以空格或“.”开头或结尾时,会自动地去掉开头和结尾处的空格和“.”。利用此特性,也可能造成“文件解析漏洞”