# 1.23 短文件名泄漏漏洞

## 背景知识

Windows 支持的长文件名最多为 255 个字符。Windows 还以 8.3 格式生成与 MS-DOS 兼容的（短）文件名，以允许基于 MS-DOS 或 16 位 Windows 的程序访问这些文件。 Windows 按以下方式从长文件名生成短文件名：

Windows 删除文件名中的任何无效字符和空格。无效字符包括：

> . ” /  \[ ] : ; = ,

由于短文件名只能包含一个英文句点 (.)，因此，Windows 将删除文件名中的其他英文句点，即使文件名中最后一个英文句点后面是有效的非空格字符，也是如此。例如，Windows 从长文件名 This is a really long filename.123.456.789.txt 生成短文件名 Thisis\~1.txt 否则，Windows 将忽略最后一个英文句点，而使用倒数第二个英文句点。例如，Windows 从长文件名 This is a really long filename.123.456.789. 生成短文件名 Thisis\~1.789 生成短文件名如果需要的话，Windows 将文件名截断为 6 个字符，并在后边附加一个波形符 (\~) 和一个数字。例如，创建的每个以”\~1″结尾的唯一文件名。复制文件名以”\~2″、”\~3″等结尾。 生成短文件名Windows 将文件扩展名截断为 3 个字符或更短。 生成短文件名Windows 将文件名及扩展名中的所有字符转为大写。

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

只有前六位字符直接显示，后续字符用\~1指代。其中数字1还可以递增，如果存在多个文件名类似的文件（名称前6位必须相同，且后缀名前3位必须相同）。后缀名最长只有3位，多余的被截断。我们可以在启用.net的IIS下暴力列举短文件名，原因是：

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

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

![](http://ww1.sinaimg.cn/large/0065jC22ly1g12pyr7hw3j30fe093gpw.jpg)

## 漏洞利用

PoC代码：

```
http://code.google.com/p/iis-shortname-scanner-poc/
```

2\).Net Framework的拒绝服务攻击

Soroush Dalilide研究发现，当请求文件夹名称包含\~1的请求，会导致不存在该文件的.Net framework去递归所有根目录。特别是第一次请求时，会造成的文件读取特别多。

漏洞利用代码：

```
http://www.exploit-id.com/dospoc/net-framework-tilde-character-dos
```

## 漏洞修复

通用有效方法：

禁用windows系统中的短文件名功能。

打开注册表并打开此目录 HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

修改 NtfsDisable8dot3NameCreation 的值为1 。

修改完成后，需要重启系统生效。

2）简单有效方法：CMD命令

Windows Server 2008 R2

查询是否开启短文件名功能：fsutil 8dot3name query

关闭该功能：fsutil 8dot3name set 1

Windows Server 2003

关闭该功能：fsutil behavior set disable8dot3 1

3）手动验证

新建文件夹并创建几个文件，打开CMD进入该文件夹呢执行dir /x 检测，看不到有显示短文件名则成功。

注: 1.Windows Server 2003修改后需要重启服务器生效！

2.已存在的文件短文件名不会取消，只对以后创建的文件有效！

3.WEB站点需要将内容拷贝到另一个位置，

如D:\www到D:\\[www.back，然后删除原文件夹D:\www，再重命名D:\www.back到D:\www。](http://www.back，然后删除原文件夹D:\www，再重命名D:\www.back到D:\www。)

如果不重新复制，已经存在的短文件名则是不会消失的。
