13.6 攻击ActiveX控件

如我们在第5章中所述,应用程序可以使用各种厚客户端技术将它的一些处理操作分配给客户端完成。ActiveX控件对于针对其他用户的攻击者特别有用。如果应用程序安装了一个可从自己的页面调用的控件,该控件必须注册为“脚本执行安全”。这样,用户访问的任何其他Web站点都能够使用这个控件。

通常,浏览器并不接受Web站点要求它们安装的任何ActiveX控件。默认情况下,当Web站点试图安装某个控件时,浏览器会显示一个安全警报,要求得到用户许可。是否信任发布该控件的Web站点以及是否允许安装该控件,将由用户自行决定。但是,如果用户安装该控件,并且其中包含任何漏洞,则用户访问的任何恶意Web站点都可以利用这些漏洞。

ActiveX控件中常见的对攻击者有用的漏洞主要分为两类。

img002 由于ActiveX控件通常以C/C++之类的本地语言编写,它们之中很可能存在一些典型的软件漏洞,如缓冲区溢出、整数漏洞以及格式字符串漏洞(请参阅第16章了解详情)。人们已经在流行Web应用程序(如在线赌博站点)发布的ActiveX控件中发现了大量这些类型的漏洞。通常,攻击者可以利用这些漏洞在受害用户的计算机上执行任意代码。

img002 许多ActiveX控件中包含一些本质上存在风险、易被滥用的方法。

img006 LaunchExe(BSTR ExeName)

img006 SaveFile(BSTR FileName, BSTR Url)

img006 LoadLibrary(BSTR LibraryPath)

img006 ExecuteCommand(BSTR Command)

开发者往往会执行这些方法来提高控件的灵活性,以便于将来扩展控件的功能,而不必部署全新的控件。但是,一旦安装了这些控件,任何恶意站点当然也可以通过同样的方式对其进行“扩展”,从而执行针对用户的恶意操作。

13.6.1 查找ActiveX漏洞

当应用程序安装ActiveX控件时,除浏览器会显示一个要求获得安装控件许可的警报外,还应该可以在某个应用程序页面的HTML源代码中看到类似于下面的代码:

img432a

这段代码告诉浏览器用指定的名称和classid示例化ActiveX控件,并从指定的URL下载该控件。如果浏览器中已经安装有控件,就不需要使用codebase参数,浏览器会根据控件的唯一classid,从本地计算机中找到该控件。

如果用户允许安装这个控件,浏览器会将其注册为“脚本执行安全”。这意味着将来任何Web站点都可以将其示例化,并调用它的方法。可以通过检查注册表项HKEY_CLASSES_ROOT\CLSID\从上面的HTML中提取的控件classid\Implemented Categories确认这一点。如果其中存在子注册表项7DD95801-9882-11CF-9FA9-00AA006C42C4,则表示该控件已经注册为“脚本执行安全”,如图13-6所示。

img432b

图13-6 已注册为“脚本执行安全”的控件

浏览器示例化ActiveX控件后,就可以通过以下脚本调用它的方法:

img432c