今天我们发布第二篇文章—SpagoBI的远程代码执行漏洞。在本文中,我想谈谈SpagoBI,SpagoBI是一款免费开源商务智能套件,其由Engineering Group的SpagoBI实验室 SpagoBI实验室开发和管理,其目标是根据其全面的开放源代码的策略,SpagoBI套件满足广大用户、客户、开发商、集成商的需求,实现一个开放性社区。
接下来让我们来看看在SpagoBI套件中尚未修复的漏洞。我之所以这么做是因为一年多后的现在,该漏洞信息厂商已经由忽略却没有任何补丁更新。这证明了当你发现一个漏洞的时候,报告漏洞给厂商可能会变得异常艰辛。
通常情况下,我并不会在补丁更新之前就公布漏洞信息。但是在这一个案例中,该漏洞需要认证权限才可利用,所以利用起来还是比较困难的。
漏洞描述
SpagoBI使用Groovy库在后端完成一些动态商业智能套件的操作。从源代码我们可以看到有后端有几个部分是用来解析输入的内容。Groovy支持本地Java对象,所以如果在这些地方没有过滤的话就很容易导致代码执行。实际上在该系统中,并没有对输入进行过滤,Groovy库中存在几个滥用的函数,攻击者可通过控制输入执行任意代码。
我们通过下载安装虚拟类镜像SpagBI 5.1来进行测试,现在我们定位到“SpagoBIQbeEngine” servlet部分(Java编写的服务器端程序)。现在登录具有最低权限的”bidemo”用户。

然后进入到”Qbe”功能模块。

在后台我们可以看到该请求希望开启一个进程。

接在客户端收到服务端响应请求可开启进程的标识符。

这一标识符对我们来说是很重要的,因为我们要利用成功这一漏洞需要借助着这一标识符作为参数传递给服务端。我们需要通过传递正确的标识符来调用存在漏洞的函数:
:8080/SpagoBIQbeEngine/servlet/AdapterHTTP?ACTION_NAME=Validate_Expression_Action&EXPRESSION=java.lang.Runtime.getRuntime().exec(‘notepad’)&fields=[{"uniqueName":"test","alias":"test"}]&SBI_EXECUTION_ID=XXX

请求详细信息:

到这里,在返回的响应包里看到什么都没有就表示着已成功利用了漏洞,在服务端可以看到记事本(notepad)已经运行了。

 
总结
在这篇文章中,我想说的是在过去长达一年多的时间里SpagoBI用户一直面临着安全风险(对照着时间线),而且现在也仍然面临着威胁。在过去的一年多了我一直在等待官方进行修复,因为我知道这一漏洞修复起来并不容易,所以我觉得等待是公平的。但是面对厂商的冷漠,我不得不披露该安全漏洞。
时间线
17/12/2014:向厂商提交包含漏洞细节第一封邮件
22/12/2014:第二封邮件请求确认漏洞
22/12/2014:收到厂商对漏洞的确认
22/01/2015:第三封邮件请求漏洞状态反馈
19/02/2015:第四封邮件请求漏洞状态反馈
23/02/2015:收到厂商回复会增加沙箱机制
24/02/2015:第五封邮件警告选择沙箱方案并没有修复漏洞
03/12/2015:第六封邮件警告白名单存在可导致在服务端执行任意代码的危险(函数)方法
03/12/2015:收到厂商反馈称他们会落实白名单的方式和细节
07/12/2015:第七封邮件警告白名单机制存在可向服务端写入任意内容的方法
09/12/2015:静悄悄的修复了任意写入问题
08/03/2016:再也没有收到厂商的反馈。现在披露此漏洞