还记得在去年的时候,我给腾讯汇报了关于QQ浏览器的两个缺陷,一个是查看源代码功能可以跨域,一个是利用恶意的POP菜单可以阻挡QQ浏览器的整个界面,导致用户无法使用QQ浏览器。这两个缺陷我汇报上去之后,杳无音信,我以为腾讯公司对我汇报的这两个缺陷不认同,所以也没有给我任何反馈。事情过去了近半年时间,最近,在无意中我下载了QQ浏览器的最新版本-QQ浏览器5.1.1,我重新拿出以前的测试网页来看一看这个新版本的QQ浏览器还有没有那两个缺陷,结果竟然发现这两个缺陷被修补了!尤其有意思的是,腾讯公司的QQ浏览器干脆去除了查看网页源代码这个功能,无论是浏览器自身的菜单中,还是鼠标右键的菜单中,我都没有找到查看网页源代码这个功能。难道说,腾讯为了修补缺陷去除了查看网页源代码的功能?无论如何,可以确定的是我汇报的缺陷应该是被“默认”了。
既然新版本的QQ浏览器出来了,那么我们也就再次测试测试,看一看能不能有什么新的收获。
新版本的QQ浏览器确实变化较大,无论功能,还是使用上都变得更加容易操作使用。我们的测试思路还是先从软件的功能上开始。
由于新版的QQ浏览器自带了一个下载程序,如图1所示。
这个QQ浏览器自带的下载程序看起来非常简便,这符合了浏览器设计上的简约模式。该下载程序允许用户编辑被下载文件的名称,但是,程序在判断被下载文件的类型时,它采用的是对被下载文件名称的后缀名进行类型判断。不同的文件类型,下载程序会显示出不同的图标。图2中,我们看到被下载文件为rar压缩文件时,它显示的图标是一个带有拉链的文件夹图标。这种设计模式可以提示用户当前被下载文件属于什么类型的文件。如果我们现在下载一个exe文件,我们可以看到图标发生了变化,如图2所示。
图3中,我们确实看到了下载程序中显示的文件图标发生了变化。
这里有一个问题,QQ浏览器自带的下载程序在下载程序时,给用户了三个选项,这三个选项在对于不同类型的被下载文件时是不一样的,当用户下载的文件类型非可执行文件时,下载程序给出的三个选项分别是“打开’’、“下载”、“取消’’。当用户下载的文件类型为可执行文件时,下载程序给出的三个选项分别是“运行’’、“下载”、“取消”。
这种选项上的变化,也可以提醒用户当前下载文件属于什么类型,是否打开运行都由用户决定。一般稍有安全意识的用户,一看被下载文件为exe类型时,他肯定不会选择“运行’’。但是,QQ浏览器在设计自带的下载程序时,虽然想到了很多细节,但是还是出现了疏漏。我们发现有一种办法可以造成QQ浏览器自带的下载程序出现显示错误,从而可以欺骗用户来运行可执行类型的文件。
在图2、3中,显示在下载程序上的被下载文件名称看起来时完整的,但是对于过长的文件名称,QQ浏览器自带的下载程序就会截断显示,这样就可以将敏感的exe字符屏蔽掉,不让用户看到。可是,还有一个问题,虽然我们屏蔽了exe字符不让用户看到,但是下载程序在给出被下载文件图标和下载选项时,也会体现出被下载程序属于可执行文件类型。如果我们可以让下载程序在下载可执行文件时显示的效果与下载普通文件的样式一样,那么我们就可以实现欺骗用户的效果了。
要想实现这个目的,我们想到了一个非常简单的原理,由于下载程序利用对文件最后一个小数点的判断来获取文件后缀名,再依据这个后缀名来判断文件类型。那么,我们如果在可执行文件后面再加一个小数点,下载程序就会出现对被下载文件类型判断的失误,从而绕过下载程序对可执行文件类型的识别。
新建一个网页,在其中输入代码:
<a href=’http://127.0.0.1/2.exe.’>a</a>
这段代码中,我们在“2.exe"这个文件名后面加上了一个小数点,这一回我们再次打开QQ浏览器,访问该网页并且利用QQ浏览器自带的下载程序下载该链接,如图3所示。
毫无疑问,我们的猜测是正确的。此刻,QQ浏览器自带的下载程序在下载“2.exe’’文件时出现了文件类型识别错误,它不认为该文件是可执行文件,图标显示的不是可执行文件类型的图标,并且给出的三个选项也与下载普通文件类型的一样,没有“运行”这个选项。
这个时候,用户已经被欺骗,他会以为当前下载的文件不是什么可执行文件,所以放心的选择“打开”,于是,我们安排好的可执行文件“2.exe’’就被顺利在用户机器上执行了。
说完这个欺骗漏洞,我们再看一看还能不能有什么新的发现。QQ浏览器的开发者在细节上会不会很注意,这是我一直怀疑的。有一种可能性就是对执行文件路径的设计细节。由于我这会测试将QQ浏览器安装在了D盘下,所以,我在D盘下建立了一个可执行文件,也就是利用Windows系统自带的计算器程序改名为“Program.exe"。现在,我们重新运行QQ浏览器,你会发现奇异的事情发生了,如图4所示。
QQ浏览器没见运行,计算器程序竟然被执行了,还是两次!这个时候,你打开任务管理器,你会发现QQ浏览器其实也已经运行了,如图5所示。
这其间的道理其实很简单,浏览器的设计者在内部调用程序时路径上存在设计错误,于是,就发生了前面的一幕。
本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。