金山毒霸可以说是现在人手必备的杀毒软件,自从免费加开发模式改变以来,我周边的 同事们都对它赞不绝口。除此以外,很多同事还喜欢利用金山毒霸的在线杀毒功能来保证爱 机的安全。面对这样一款优秀的杀毒软件,我们在为其欣喜的时候,也不能不注意它自身的 安全性,毕竟安全软件的目的就是为了防范恶意攻击。 无意中,我发现金山毒霸提供的在线杀毒功能所使用的 ActiveX 控件存在一个安全隐 患,可以借助该控件来欺骗用户,甚至是诱使用户主动泄漏自己的系统信息。金山毒霸提供 的在线杀毒功能向系统注册了两个ActiveX控件,都存在该安全隐患。下面,我们就其中一 个 ActiveX控件为例,看一看这个漏洞是怎么被发现和利用的。 凡是使用了金山毒霸提供的在线杀毒功能的用户,都会被安装上金山毒霸在线杀毒控 件,这其中有一个 ActiveX 控件的名称为:kxerqst0.dll。它的文件位置在“C:\Program Files\Kingsoft\kolscan”下,如图1所示。 ![]() 该控件提供了两个函数,即GetOpenFileNameEx和GetOpenFileNameEx2。从名字上我 们可以看出,这两个函数都是用来打开文件的。我们暂时理解为金山毒霸的在线杀毒功能利 用该控件来实现打开用户系统上的文件或者文件夹。 我们首先来对比看一看GetOpenFileNameEx和GetOpenFileNameEx2两个函数的原型, 如下: Function GetOpenFileNameEx ( ByVal bNotUseDefaultView As Boolean , ByVal bstrCaption As String , ByVal bstrSubtitle As String , ByVal colorDialog As Long ) As String Function GetOpenFileNameEx2 ( ByVal bNotUseDefaultView As Boolean , ByVal bstrCaption As String , ByVal bstrSubtitle As String , ByVal colorDialog As Long , ByVal nX As Variant , ByVal nY As Variant , ByVal bRelativeParent As Boolean , ByVal nReserved As Variant ) As String 从上面的原型可以看出, GetOpenFileNameEx2比GetOpenFileNameEx函数多了四个参 数,其中有两个是控制位置的参数,即nX和 nY(其实这两个参数在后面的欺骗中也可以起 到一定作用,读者下来可以自行分析思考一下)。除此之外,两个函数的差别并不大。既然 这样,我们这里选择GetOpenFileNameEx2函数来做一个测试,看一看GetOpenFileNameEx2 函数是如何工作的。测试代码如下: <object classid="clsid:EE69644E-8492-457A-87DC-15C3AE822E79" name="evil" ></object> <script> var a=evil.GetOpenFileNameEx2(1," ","",0,100,100,0,0); document.write(a); </script> 保存上述代码为 poc.htm,将其放置在本地搭建的 IIS 目录下面,用浏览器访问效果 如图 2所示。 ![]() 在打开poc.htm网页后,浏览器弹出了一个文件选择对话框,上面显示着一段话“请 选择扫描路径:”,这就证明了我们前面的猜想,GetOpenFileNameEx2 函数确实是金山毒霸 在线杀毒功能提供的用来打开用户系统上文件的函数。我们这里随意选择了两个文件后,点 击“确定”按钮,此时,浏览器显示出了新的内容,如图3 所示。 ![]() 此刻,浏览器竟然显示出了我们前面选择的两个文件的真实路径。请大家注意,浏览器 显示的内容是具有一定格式,细细分析起来,原来 GetOpenFileNameEx2 函数在等待用户选 择好被查杀的文件后,会将被选择文件的真实路径组合成为一个固定格式,其后将该格式数 据传递给杀毒软件内部,从而开始进行在线杀毒。 看着图 3 显示的内容,这个时候,我们忽然有了一个思路,我们可不可以利用金山毒霸 的这个功能来获取用户系统上的敏感信息呢?具体地说,就是借助金山毒霸的这个功能来远 程获取到用户系统上有哪些文件以及这些文件的路径。 要想实现这个目的,我们需要分两步来实现,第一步就是构造一个带有欺骗性质的文件 选择对话框,诱使用户自己主动选择爱机上的文件。也许金山毒霸在编写这个功能的时候, |