IIS短文件名漏洞

漏洞原理


windows在创建一个新文件时,操作系统还会生成 8.3 格式的兼容 MS-DOS 的(短)文件名,以允许基于 MS-DOS 或16位 windows 的程序访问这些文件。

利用场景


1、用于猜解文件/文件名

2、.Net Framework 的拒绝服务攻击(不常见)

检测方法


黑盒测试

使用
IIS短文件名扫描器

白盒测试
几乎所有的 windows 操作系统,在 cmd 中使用命令:

dir /x

如图:
短文件名显示

修复方案


1、升级 .net framework 至 4.0 版本或以上

2、修改注册表键值

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 修改NtfsDisable8dot3NameCreation为1。(此项默认为0)

此设置用于禁用短文件名功能,重启后生效。

或者通过 CMD 命令:

Windows Server 2008 R2
查询是否开启短文件名功能:fsutil 8dot3name query
关闭该功能:fsutil 8dot3name set 1

Windows Server 2003
关闭该功能:fsutil behavior set disable8dot3 1

以上操作只能防止新创建的文件/文件名不会出现短文件名,而当前文件/文件名依然保持短文件名。完整解决方案还需要如下操作:

3、

  a、从当前目录中创建一个副本,并将其重命名为 tempNew;

  b、将当前目录重命名为“tempOld”;

  c、将“tempNew”重命名为原来的目录名。

4、禁止 url 中使用 “~” 或它的 Unicode 编码。(IIS7.0的请求阻塞不能完全阻止“~”波浪号。)




背景知识


windows 支持的长文件名最多为 255 个字符。windows 还以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 windows 的程序访问这些文件。

8.3格式短文件名规范中:

‘8’是指文件名或目录名的主体部分小于等于 8 个字节;‘3’是指文件名的扩展名部分小于等于 3 个字节。

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 10 Pro released in July 2015Windows 10 Enterprise released in July 2015Microsoft Windows Server 2003 Standard EditionMicrosoft Windows Server 2003 Enterprise EditionMicrosoft Windows Server 2003 Datacenter EditionMicrosoft Windows Server 2003 Web EditionMicrosoft Windows Server 2003, Enterprise x64 EditionMicrosoft Windows Small Business Server 2003 Standard EditionMicrosoft Windows Small Business Server 2003 Premium EditionMicrosoft Windows XP Home EditionMicrosoft Windows XP Professional EditionMicrosoft Windows Datacenter Server Limited EditionMicrosoft Windows Advanced Server, Limited EditionMicrosoft Windows 2000 ServerMicrosoft Windows 2000 Advanced ServerMicrosoft Windows 2000 Professional EditionMicrosoft Windows NT Workstation 3.5Microsoft Windows NT Workstation 3.51Microsoft Windows NT Workstation 4.0 开发员版Microsoft Windows NT Server 3.51Microsoft Windows NT Server 4.0 Standard EditionWindows Vista Service Pack 2Windows Vista BusinessWindows Vista EnterpriseWindows Vista Home PremiumWindows Vista UltimateWindows Server 2008 Service Pack 2Windows Server 2008 StandardWindows Server 2008 EnterpriseWindows Server 2008 DatacenterWindows Server 2008 for Itanium-Based SystemsWindows 7 Service Pack 1Windows 7 Home PremiumWindows 7 ProfessionalWindows 7 EnterpriseWindows 7 UltimateWindows Server 2008 R2 Service Pack 1Windows Server 2008 R2 StandardWindows Server 2008 R2 EnterpriseWindows Server 2008 R2 DatacenterWindows Server 2008 R2 for Itanium-Based SystemsWindows 8 EnterpriseWindows 8 ProWindows Server 2012 FoundationWindows Server 2012 FoundationWindows Server 2012 FoundationWindows Server 2012 FoundationWindows Server 2012 StandardWindows Server 2012 StandardWindows Server 2012 StandardWindows Server 2012 StandardWindows Server 2012 DatacenterWindows Server 2012 DatacenterWindows Server 2012 DatacenterWindows Server 2012 Datacenter
列表内所有操作系统均受影响(数据来源日期:20171213)

该漏洞有其局限性:

1、只能猜解文件/文件夹名前六位,以及扩展名前三位

2、名称较短的文件是没有响应的短文件名的

3、需要 IIS 和 .net 同时满足。

漏洞详情


在 windows 上的 Apache(Apache支持短文件名)上运行的 web 应用程序正在创建一个长文件名文件(如sql备份文件或会话文件,假设文件名是 backup-082119f75623eb7abd7bf357698ff66c.sql,windows 将创建短文件名 BACKUP〜1.SQL)。这种情况下,如果我们用短文件名访问这个文件,那么就有可能获取这个包含sql数据库备份的文件。

比较著名的一个例子:

wordpress 有一个备份博客的插件,该插件会为备份创建一个自定义目录(backup-88456)。备份完成后,该目录包含一个名为 wordpress_wp_20120702_576.sql 的文件 ,即 WordPress 数据库备份。这本应该难以猜测的,因为我们的目录名称中有5个数字加上日期和另外3个数字,即使忽略日期也至少有 100,000,000 个组合。然而由于短文件名的原因,目录名会变成 BACKUP~1 而文件名会变成 WORDPR~1.SQL。100,000,000 个组合被缩减为一个组合。

漏洞利用


短文件名漏洞
漏洞利用需要使用到通配符。在 windows 中,* 可以匹配n个字符(n可以为0,一个星号和n个星号的意义一样)。判断某站点是否存在 IIS 短文件名爆破,构造如下payload:

1. http://www.xxx.com/*~1*/.aspx
2. http://www.xxx.com/l1j1e*~1*/.aspx

若1返回404而2返回400,则可以判断目标站点存在漏洞。

判断漏洞存在后,继续猜解目录下是否存在a开头的文件或文件夹,访问:

http://www.xxx.com/a*~1*/.aspx

若存在将返回404,不存在则返回400。以此类推,不断向下猜解所有的6个字符。

到此要考虑两种情况,若abcdef开头的是一个文件夹则

http://www.xxx.com/abcdef*/~1/.aspx

返回404。若abcdef开头的是一个文件,则

http://www.xxx.com/abcdef*~1/.aspx

返回404(注意!返回404表示存在)同理我们可以猜出文件后缀名:

http://www.xxx.com/abcdef*~1*h*/.aspx

若返回404则代表扩展名中肯定存在h字符。

利用此漏洞可以猜解后台地址、敏感文件/文件名(如备份的rar、bak、sql等);某些情况下,可以通过短文件名漏洞直接下载对应的文件(如备份sql文件)。



.Net Framework 拒绝服务攻击

当请求文件夹名称包含 ~1 的请求,会导致不存在该文件的 .Net Framework 去递归查询所有根目录。如果只有一个“~1”是无效的,当“~1”大于一个,比如像这样:

\wwwtest\fuck~1\~1\~1\~1.aspx

此时文件系统会这样调用:

\wwwtest                           SUCCESS
\wwwtest\fuck~1\~1\~1\~1           PATH NOT FOUND
\wwwtest\fuck~1                    NAME NOT FOUND
\wwwtest\fuck~1\~1\                PATH NOT FOUND
\wwwtest\fuck~1\~1\~1\             PATH NOT FOUND
\wwwtest\fuck~1\~1\~1\~1.aspx      PATH NOT FOUND
\wwwtest\fuck~1\~1\~1\~1.aspx      PATH NOT FOUND
\wwwtest\fuck~1\~1\~1              PATH NOT FOUND
\wwwtest\fuck~1\~1\~1\~1.aspx      PATH NOT FOUND
\wwwtest\fuck~1\~1\~1              PATH NOT FOUND
\wwwtest\fuck~1\~1                 PATH NOT FOUND
\wwwtest\fuck~1                    NAME NOT FOUND
\wwwtest                           SUCCESS
\wwwtest                           SUCCESS

如果我们请求的文件/文件夹名同时存在大小写时,这个请求会被请求两次,一次是原封不动的请求,一次是全部使用小写的请求。

下表显示了每个请求的FS调用的数量(Windows 2008 R2, IIS 7.5(latest patch – June 2012), and .Net framework 4.0.30319 (在别的系统下可能会不同))

F5调用

这个问题适用于当时的 .Net framework 的所有版本(

IIS 1.0, Windows NT 3.51

IIS 2.0, Windows NT 4.0

IIS 3.0, Windows NT 4.0 Service Pack 2

IIS 4.0, Windows NT 4.0 Option Pack

IIS 5.0, Windows 2000

IIS 5.1, Windows XP Professional and Windows XP Media Center Edition

IIS 6.0, Windows Server 2003 and Windows XP Professional x64 Edition

IIS 7.0, Windows Server 2008 and Windows Vista

IIS 7.5, Windows 7 (error remotely enabled or no web.config)

IIS 7.5, Windows 2008 (classic pipeline mode))

只是 F5 的调用次数会有不同。

参考链接


2018/12/13 15:37 下午 posted in  中间件