工作中需要使用报表工具,乙方公司提到了一款名为“AcReport”的报表工具,上网搜索到一些相关信息“AnycellReport(简称ACReport)是一款中国式报表组件,是国内最早的基于表格,支持图文混排、公式和脚本的中国式报表工具之一。就如AnycellReport的名称那样,灵活强大的表格功能一直是ACReport区别于其它软件或控件最显著的特征之一,ACReport表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,调整某行上单元格的宽度时,不影响其它行中的单元格。在制作复杂的中国式报表时可以避免很多不必要的合并拆分操作,制作表格更加方便和随心所欲,并且省时
省力。ACReport单元格支持多种丰富的形态,例如格式化文本、图片、图表、条码、OLE容器等。”看起来非常不错,而且该软件的开发人员估计也长混迹于CSDN,技术方面绝对可以肯定。但是,由于工作性质要求,安全问题必须放在首位,如此一来,只好对该软件进行一些安全测试,漏洞也就由此发现了。
被测试的软件版本为“AcReport2.70_pub”,该软件下载后为一个压缩包,可以自行按照其中的说明书来注册使用该软件。AcReport提供了两个ActiveX控件,一个为AcReport报表引擎文件-AcReport.dll,一个为AcVisualControls.ocx,即ActiveX控件主文件。
这里只针对AcVisualControls.ocx文件进行了安全测试。
用OLEView查看AcVisualControls.ocx文件注册的组件信息,发现其注册了两个COM类,分别是:AcWebClientView和AcDesignerView。我们写了一段代码了检测AcDesignerView这个COM类,代码如下所示。
object classid=clsid:808171F3-63C5-4B2C-AD99-7E7A24A10948 name=evil width=600height=600/objec scrip try{ document.write(evil.LoadReportFromFile(c:\\00.apt)); } /scrip
其中,“LoadReportFromFile”是AcDesignerView的一个外部接口,它的作用为加载报表文件。“00.apt”是AcReport报表文件存储类型,AcReport报表自带了很多apt样例,它们放置在AcReport解压后的“demos\reports”文件目录下。正常加载报表文件后的浏览器显示效果如图1所示。
图1正常加载报表文件后的IE显示效果
在正常加载报表文件过程中,浏览器会出现闪烁效果,这估计是AcReport报表加载报表时有一个瞬间的界面显示所造成的闪烁。既然有加载报表文件,那么就应该有导出报表文件的外部接口,很幸运,我们找到这个函数的名称为“SaveReportToFile”。此时,我们猜想,如果可以修改报表文件内容,利用AcDesignerView的报表加载和导出接口,是不是可以将我们需要的内容写入到指定文件当中。于是,我们写了一个新的测试代码如下所示:
object classid=clsid:808171F3-63C5-4B2C-AD99-7E7A24A10948 name=evil width=600height=600/objec scrip try{ document.write(evil.LoadReportFromFile(c:\\00.apt)); } evil.SaveReportToFile(c:\\1.bat); /scrip
测试发现,AcDesignerView果然在导出报表时,不区分最终生成文件后缀名,这意味着,如果我们可以修改apt文件内容,就可以将修改后的内容写入到本地磁盘上,并且保存为任意格式,这里甚至包括二进制可执行文件格式。
利用WinHex打开apt文件,我们发现该文件其实就是一个复合数据文件,其中包含报表中格式文档的原始数据,如图2所示。
图2apt的数据格式
这种未公开的数据格式虽然有规律可循,但是随意的修改会引发数据被破坏,最终AcReport报表将不会打开该错误报表文件,导致后面的导出保存步骤无法执行。
经过一定时间的摸索,我们发现可以在apt的头部插入CMD命令,并且不会破坏apt数据格式,如图3所示。
将该apt文件保存,利用前面的测试网页代码,我们准备将带有CMD命令的apt文件导入成为一个批处理格式的文件,看一看数据会不会发生变化。测试发现,AcReport报表在处理apt文件时,具有一定的容错性,可以将我们包含有CMD命令的apt导出并保存在本地磁盘上,成为批处理文件。此时,如果导出的文件被保存到用户的启动目录下,那么我们的CMD命令就可以远程获得执行的机会了,如图4所示。
图4导出的bat文件可以成功运行植入的CMD命令
这种远程的CMD命令植入式漏洞,在局域网环境内部非常好用,如果存在该漏洞的ActiveX控件的外部接口支持远程URL加载文件,那么,就可以在互联网上大显神威。其实,AcReport报表出现漏洞的地方远不只这一处,很多地方还存在可以被有效利用的安全漏洞,诸如信息泄露漏洞。读者有兴趣可以自行挖掘测试一番,有什么心得体会拿出来一起分享。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。