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

漏洞利用

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。

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