IIS短文件名漏洞

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 安装成功以后,会默认在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 总结

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

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