0x00 IIS短文件名

为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的DOS 8.3 短文件名。

Windows下查看对应的短文件名,可以使用命令 dir /x


对应短文件名的规律是:

  • 前六位保留
  • 所有小写字母均转换成大写字母
  • 后续字符用~1表示
  • 后缀最多显示三位,其余的被截断
  • 长文件名前缀/文件夹名字符长度符合0-9和Aa-Zz范围且需要大于等于9位才会生成短文件名,如果包含空格或者其他部分特殊字符,不论长度均会生成短文件

0x01 IIS短文件名漏洞

在IIS的web服务中,有时无法直接访问一些文件,但是我们发送一个存在通配符* 和?的请求,当IIS接收到一个文件路径中包含~的请求时,根据文件是否存在返回值是不同的,我们可以利用这个方法猜解本来无法得到的文件名。

  • 访问构造的某个存在的短文件名,会返回404
  • 访问构造的某个不存在的短文件名,会返回400

0x02 影响版本

本来受到IIS短文件名漏洞影响的版本如下:

1
2
3
4
5
6
7
8
9
10


IIS 1.0,Windows NT 3.51  
IIS 3.0,Windows NT 4.0 Service Pack 2
IIS 4.0,Windows NT 4.0选项包
IIS 5.0,Windows 2000
IIS 5.1,Windows XP Professional和Windows XP Media Center Edition
IIS 6.0,Windows Server 2003和Windows XP Professional x64 Edition
IIS 7.0,Windows Server 2008和Windows Vista
IIS 7.5,Windows 7(远程启用<customErrors>或没有web.config)
IIS 7.5,Windows 2008(经典管道模式)
注意:IIS使用.Net Framework 4时不受影响


以上受影响范围主要是针对HTTP GET方法,且需要同时安装ASP.NET应用程序。

但是漏洞发现者Soroush Dalili之后再次在IIS7.5和IIS8.0的版本中发现,当使用OPTIONS来代替GET 方法时,如果请求中的短文件名是存在的,IIS会返回一个不一样的错误信息。

而且在之后的版本中此漏洞也都成功验证。

所以影响的版本又加上了:

1
2
3


IIS 8.0,Windows 8, Windows Server 2012
IIS 8.5,Windows 8.1,Windows Server 2012 R2
IIS 10.0,Windows 10, Windows Server 2016


所以,短文件名漏洞存在于目前IIS的所有版本中。

0x03 漏洞复现

在windows10下打开IIS服务

开始—–>控制面板—->程序—->启用或关闭windows功能,勾选以下选项,安装IIS。

​​

在浏览器访问ip地址,如果发现IIS windows信息说明安装成功。

IIS短文件名漏洞_.net

IIS 安装成功以后,会默认在C盘目录下生成intpub目录,网站的根目录位于C:\inetpub\wwwroot,此时我们创建几个asp文件之后,再使用dir /x查看下根目录是否存在短文件名

​​

我们可以看到,有的文件有短文件名,有的文件没有,这是因为之前提到的,长文件名前缀/文件夹名字符长度符合0-9和Aa-Zz范围且需要大于等于9位才会生成短文件名,如果包含空格或者其他部分特殊字符,不论长度均会生成短文件。

0x04 漏洞利用

常用的利用方式有以下几种

短文件名泄露

我们可以写python脚本通过HTTP的OPTIONS方法爆破文件名,也可以下载专用的爆破工具来扫描。

apache下通过短文件名下载

当Apache运行在windows下,如果创建了一个长文件,那么无需猜解长文件,直接用短文件就可以下载了。

Net Framework的拒绝服务攻击

当请求文件夹名称包含~1的请求,会导致不存在该文件的.Net framework去递归所有根目录。特别是第一次请求时,会造成的文件读取特别多。用僵尸网络不断向服务器发送此类请求,很容易耗尽对方服务器资源。

0x05 局限性

  • 1.此漏洞只能确定前6个字符,如果后面的字符太长、包含特殊字符,很难猜解
  • 2.如果文件名本身太短(无短文件名)也是无法猜解的
  • 3.如果文件名前6位带空格,8.3格式的短文件名会补进,和真实文件名不匹配
  • 4.如果文件夹名前6位字符带点“.”,扫描程序会认为是文件而不是文件夹,最终出现误报
  • 5.不支持中文文件名,包括中文文件和中文文件夹。一个中文相当于两个英文字符,故超过4个中文字会产生短文件名,但是IIS不支持中文猜测

0x06 应对

禁止url中使用“~”或它的Unicode编码

关闭windows的8.3格式功能

  • 命令行中关闭:
1
fsutil 8dot3name set 1



  • 注册表中禁用:
    在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,将其中的 NtfsDisable8dot3NameCreation这一项的值设为 1,代表不创建短文件名格式

升级netFramework至4.0以上版本

修改注册表禁用短文件名功能

0x07 利用

1. 猜解后台地址
2. 猜解敏感文件,例如备份的rar、zip、.bak、.SQL文件等。
3. 在某些情形下,甚至可以通过短文件名web直接下载对应的文件。比如下载备份SQL文件。


该短文件名有以下特征:

1. 只有前六位字符直接显示,后续字符用~1指代。其中数字1还可以递增,如果存在多个文件名类似的文件(名称前6位必须相同,且后缀名前3位必须相同)。

2. 后缀名最长只有3位,多余的被截断。

我们可以在启用.net的IIS下暴力列举短文件名,原因是:

3. 访问构造的某个存在的短文件名,会返回404

4. 访问构造的某个不存在的短文件名,会返回400

利用

1、 测试环境为windows server 2003 r2,开启webdav服务和net服务。

  IIS短文件名漏洞_后缀名_02

2、使用payload验证目标是否存在IIS短文件名漏洞,下图显示的404,说明目标存在该短文件名

Payload: http://192.168.10.130 /*~1*/a.aspx

http://192.168.10.130/ttt*~1*/a.aspx

注:*可以匹配n个字符,n可以为0

  IIS短文件名漏洞_后缀名_03

3、浏览器访问一个不存在的短文件名,返回”Bad Request(400)”,说明目标不存在该短文件名

  IIS短文件名漏洞_文件名_04

4、通过浏览器访问上面两个payload,根据返回的结果,可以说明目标存在IIS短文件漏洞

5、判断漏洞存在后,接下来手工详细分析猜解IIS短文件名原理

5.1、在网站根目录(C:\Inetpub\wwwroot)下创建一个abcdef123456.txt文件

5.2、浏览器分别访问http://192.168.10.130/a*~1*/a.aspx, http://192.168.10.130/b*~1*/a.aspx

  IIS短文件名漏洞_根目录_05

  IIS短文件名漏洞_根目录_06

5.3、通过以上两个图片,可以看出存在一个以a开头的短文件名

5.4、按照上面的方法依次猜解可以得到http://192.168.10.130/abcdef*~1*/a.aspx,到此,已经猜解出来短文件名,到了这一步,需要考虑两种情况,以abcdef开头的是一个文件夹还是一个文件。

如果以abcdef开头的是一个文件夹,那么浏览器访问http://192.168.10.130/abcdef*~1/a.aspx,将返回404,如果abcdef开头的是一个文件,需要猜解后缀名


5.5、浏览器访问http://192.168.10.130/abcdef*~1/a.aspx,根据下图返回结果说明以abcdef开头的不是一个文件夹,而是一个文件

  IIS短文件名漏洞_.net_07

5.6、浏览器访问http://192.168.10.130/abcdef*~1.a*/a.aspx,根据下图返回说明该短文件后缀的第一位不是a

  IIS短文件名漏洞_文件名_08

5.7、用a-z的26个字母依次替换上述a的位置,当替换成t时,返回404页面,说明该短文件的第一位后缀是t

  IIS短文件名漏洞_后缀_09

5.8、按照上面的方法依次猜解得到该短文件名的后缀是txt

5.9、到此为止,已经猜解出该短文件名为abcdef~1.txt

6、根据已经猜解出来的短文件名abcdef~1.txt,继续猜解出该短文件名的完全文件名为abcdef123456.txt

7、使用IIS短文件名扫描软件,获取目标存在哪些短文件名

  IIS短文件名漏洞_根目录_10

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



一个站,密码不是弱口令,还有验证码,自然不好爆破之类




 


IIS短文件名漏洞_后缀名_11

 

 


 


扫描后台结果显示




 


IIS短文件名漏洞_后缀_12

IIS短文件名漏洞_.net_13

 

 


访问/test.aspx




 


IIS短文件名漏洞_.net_14

 

 


????

云悉信息搜集显示




 


IIS短文件名漏洞_后缀名_15

 

 


Iis7.5和.net都具备了可以考虑一波是否存在iis短文件名漏洞

我使用的是李劼杰的工具:

​https://github.com/lijiejie/IIS_shortname_Scanner​

扫描结果如下




IIS短文件名漏洞_.net_16

 

 


4个目录,共找到6个文件,现在开始猜解文件名

最后猜到/rninde~1.asp*应该是/rnindex.aspx,访问该页面




 IIS短文件名漏洞_后缀_17

 

 


发现没有了验证码,我们便可以尝试爆破登录等。


0x08 总结

IIS短文件名泄漏漏洞局限性

这个漏洞的局限有几点:

1) 只能猜解前六位,以及扩展名的前3位。

2) 名称较短的文件是没有相应的短文件名的。

3)需要IIS和.net两个条件都满足

IIS短文件名泄漏漏洞危害:

Microsoft IIS在实现上存在文件枚举漏洞,***者可利用此漏洞枚举网络服务器根目录中的文件。

危害:***者可以利用“~”字符猜解或遍历服务器中的文件名,或对IIS服务器中的.Net Framework进行拒绝服务***。

相对来说这个漏洞比较鸡肋,微软也表示IIS短文件漏洞未达到安全更新标准,需要确定何时在下一个逻辑版本中解决它。

虽然漏洞的威胁不大,但是正因不严重导致微软没有更新,现在所有版本都存在这个问题,当有人将其与其他漏洞配合起来使用时,也是有可能造成很严重的后果。