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 |
|
以上受影响范围主要是针对HTTP GET方法,且需要同时安装ASP.NET应用程序。
但是漏洞发现者Soroush Dalili之后再次在IIS7.5和IIS8.0的版本中发现,当使用OPTIONS来代替GET 方法时,如果请求中的短文件名是存在的,IIS会返回一个不一样的错误信息。
而且在之后的版本中此漏洞也都成功验证。
所以影响的版本又加上了:
1 |
|
所以,短文件名漏洞存在于目前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短文件漏洞未达到安全更新标准,需要确定何时在下一个逻辑版本中解决它。
虽然漏洞的威胁不大,但是正因不严重导致微软没有更新,现在所有版本都存在这个问题,当有人将其与其他漏洞配合起来使用时,也是有可能造成很严重的后果。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!