网页传播的木马原理及对策

来源:互联网 发布:app ui设计软件 编辑:程序博客网 时间:2024/04/30 01:04
大家在浏览网页的时候,一不小心就会中木马。有的人很疑惑:“我又没有运行一些不不认识的程序,怎么会感染木马呢?”。其实按照现在的木马技术,根本不需要你主动运行它,只需利用操作系统的不安全的地方,通过浏览网页的过程自动注入的。请看下文。

一、网页木马或病毒传播机理:

我总结了一下,大概有以下几步骤:

1、下载木马程序。
这里使用Microsoft.XMLHTTP对象和ADODB.Stream对象将网站上事先放好的木马可执行文件(exe或dll形式的com组件)下载到本地。Microsoft.XMLHTTP对象负责获取木马文件内容,ADODB.Stream对象负责存盘。这种方法,我们开发Linkworks.net中所用到的Ajax技术已经用到了,我不多说了。

2、放置木马程序到指定的目录、伪装木马程序为系统文件

这里调用Scripting.FileSystemObject 组件将下载的木马程序拷贝到指定的目录。
这两个组件完成的功能一样,都是对文件,文件夹进行拷贝,删除,移动,重命名等操作。

我挑出了一些方法,大家看一下,一旦在脚本中调用这些方法,就可以在你机器上任意位置埋藏木马。

        //列举驱动器
        IDriveCollection* Drives();
       
 //判断驱动器是否存在
        VARIANT_BOOL DriveExists([in] BSTR DriveSpec);

        //判断文件是否存在
        VARIANT_BOOL FileExists([in] BSTR FileSpec);

        //判断目录是否存在
        VARIANT_BOOL FolderExists([in] BSTR FolderSpec);
       
 //获取特殊路径(如系统路径,临时路径。。。)
        IFolder* GetSpecialFolder([in] SpecialFolderConst SpecialFolder);

 //删除文件
        void DeleteFile([in] BSTR FileSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);

        //删除目录
        void DeleteFolder([in] BSTR FolderSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);
      
 //移动文件
        void MoveFile([in] BSTR Source,[in] BSTR Destination);

        //移动目录
        void MoveFolder([in] BSTR Source, [in] BSTR Destination);

        //拷贝文件
        void CopyFile([in] BSTR Source, [in] BSTR Destination, [in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);
       
 //拷贝目录
        void CopyFolder([in] BSTR Source,[in] BSTR Destination,[in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);
       
 //创建目录
        IFolder* CreateFolder([in] BSTR Path);

 //创建文本文件
        ITextStream* CreateTextFile([in] BSTR FileName,[in, optional, defaultvalue(-1)] VARIANT_BOOL Overwrite, [in, optional, defaultvalue(0)] VARIANT_BOOL Unicode);

        //打开文本文件
        ITextStream* OpenTextFile([in] BSTR FileName,[in, optional, defaultvalue(1)] IOMode IOMode, [in, optional, defaultvalue(0)] Tristate Format);

 //获取标准的输入输出流
        ITextStream* GetStandardStream([in] StandardStreamTypes StandardStreamType,[in, optional, defaultvalue(0)] VARIANT_BOOL Unicode);

3、注入木马,获取计算机的控制权
    对于木马的形式是dll的com组件的,一般木马作者会将这种com组件做成“Shell扩展”、“浏览器插件”、“浏览器辅助对象”、“地址栏挂钩”、“网络协议劫持插件”、“网络协议过滤插件”,“office的Addin程序”等等形式。这里就需要修改注册表的操作了。脚本程序可以通过调用WScript.Shell对象的RegRead、RegWrite、RegDelete方法来实现注册表的操作。

    对于木马形式是exe的,那就有很多方法进行注入了
1) 调用WScript.Shell对象的Run或Exec方法来直接执行exe程序.
2) 调用Shell.Application对象的Open或Explore方法来执行exe程序。
3) 调用WScript.Shell对象的RegRead、RegWrite、RegDelete方法将exe文件设置为开机自动启动。自启动的程序有多种多样,这里暂不扩展。
4) 调用WScript.Shell对象的CreateShortcut方法创建一个快捷方式,放到开始菜单中的启动目录里。以便下次开机运行。
5) 调用Scripting.FileSystemObject对象的CreateTextFile方法创建一个批处理文件、vbs文件、js文件等可执行的脚本文件来运行exe。

二、对策

        首先vb脚本或javascript脚本的运行,虽然可以在IE中被禁用,但这样会导致目前大多数网站的浏览不正确,这显然不是我们所希望的。
        如果我们能阻止脚本程序对本机的文件操作、目录操作、注册表操作、程序运行等进行控制,那自然可以起到阻止木马入侵的功能。
我们先分析一下以上关键的com对象:

Scripting.FileSystemObject  是由系统目录中的scrrun.dll实现
WScript.Shell    是由系统目录中的wshom.ocx实现
Shell.Application   是由系统目录中的SHELL32.dll实现

因此我们可以 写一个批处理文件,将这三个不安全的组件进行卸载,批处理文件内容如下:

regsvr32 /u /s %SystemRoot%/system32/SHELL32.dll
regsvr32 /u /s %SystemRoot%/system32/wshom.ocx
regsvr32 /u /s %SystemRoot%/system32/scrrun.dll

当这几个com组件卸载后,恶意脚本就无法进行文件,注册表操作以及运行程序了,想注入自然不可能了。

三、影响

        scrrun.dll,wshom.ocx,SHELL32.dll这几个组件基本都是给脚本调用的,我们常见的脚本又大多在网页中,只要我们自己的程序不去调用这些组件,那基本没什么问题了。
       不过我也发现了个别情况,比如Visual Studio .Net 2003开发工具,它创建一个工程时,所使用的工程模板中用到了脚本,并使用了Scripting.FileSystemObject对象,因而会出现创建工程失败的问题。还有Office 2003里,也会用到这个组件,但不影响正常使用。