昨天写了个“IIS短文件名暴力猜解漏洞”的利用脚本(比网上传播的那个Java POC能猜解出更多文件和文件夹)。 在此,把漏洞做个简单的分析和总计。
1. 漏洞的成因
为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3 短文件名。
在Windows下查看对应的短文件名,可以使用命令dir /x。
比如,我在D盘下创建了一个名为aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.html文件:
D:\>dir /x 驱动器 D 中的卷是 Data 卷的序列号是 3EDF-2E00 D:\ 的目录 2014/10/11 13:08 256,515,706 2014101.sql 2014/10/13 17:01 0 AAAAAA~1.HTM aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa .html 2 个文件 256,515,706 字节 0 个目录 107,017,154,560 可用字节
观察命令结果,可以看到,其对应的短文件名 AAAAAA~1.HTM。该短文件名有以下特征:
- 只有前六位字符直接显示,后续字符用~1指代。其中数字1还可以递增,如果存在多个文件名类似的文件(名称前6位必须相同,且后缀名前3位必须相同)。
- 后缀名最长只有3位,多余的被截断。
我们可以在启用.net的IIS下暴力列举短文件名,原因是:
- 访问构造的某个存在的短文件名,会返回404
- 访问构造的某个不存在的短文件名,会返回400
2. 漏洞的利用
漏洞的利用,需要使用到通配符*。在windows中,*可以匹配n个字符,n可以为0. 判断某站点是否存在IIS短文件名暴力破解,构造payload,分别访问如下两个URL:
1. http://www.target.com/*~1****/a.aspx
2. http://www.target.com/l1j1e*~1****/a.aspx
这里我使用了4个星号,主要是为了程序自动化猜解,逐个猜解后缀名中的3个字符,实际上,一个星号与4个星号没有任何区别(上面已经提到,*号可以匹配空)。
如果访问第一个URL,返回404。
而访问第二个URL,返回400。 则目标站点存在漏洞。
判断漏洞存在后,继续猜解目录下是否存在一个a开头的文件或文件夹,访问:
http://www.target.com/a*~1****/a.aspx
如果存在,将返回404。 如此反复,不断向下猜解完所有的6个字符。
猜解完之后,得到的序列应该类似:
http://www.target.com/abcdef*~1****/a.aspx
到了这一步,需要考虑两种情况,如果以abcdef开头的是一个文件夹,则
http://www.target.com/abcdef*~1/a.aspx
将返回404.
如果abcdef开头的是一个文件,则自动提交
http://www.target.com/abcdef*~1*g**/a.aspx
用a-z的26个字母替换上述g的位置,应该能得到多个404页面。(记住一点,404代表的是存在。)如果下面的地址返回404,
http://www.target.com/abcde*~1*g**/a.aspx
则代表扩展名中肯定存在g。
按照上面的思路,继续猜解g后面的字符,直到后缀名中的3个字符都猜解完,就可以了。
以上介绍了怎么手工猜解,这个漏洞的意义何在:
- 猜解后台地址
- 猜解敏感文件,例如备份的rar、zip、.bak、.SQL文件等。
- 在某些情形下,甚至可以通过短文件名web直接下载对应的文件。比如下载备份SQL文件。
3.漏洞的局限性
这个漏洞的局限有几点:
1) 只能猜解前六位,以及扩展名的前3位。
2) 名称较短的文件是没有相应的短文件名的。
3)需要IIS和.net两个条件都满足。
4. 漏洞的修复
1) 升级.net framework
2) 修改注册表键值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
修改NtfsDisable8dot3NameCreation为1。
3) 将web文件夹的内容拷贝到另一个位置,比如D:\www到D:\www.back,然后删除原文件夹D:\www,再重命名D:\www.back到D:\www
如果不重新复制,已经存在的短文件名则是不会消失的。
本文参考链接:
http://www.acunetix.com/blog/articles/windows-short-8-3-filenames-web-security-problem/