BigTree CMS是一个小众的内容管理系统,其不依赖于任何框架,并且用户使用方便,开发便捷。在本文中,我们将会介绍一些我们在BigTree的代码中发现的漏洞。
我们对最新版本的BigTree CMS 4.4.6
进行审计,发现了多个漏洞。其中包括一个SQL注入漏洞和一个Phar反序列化漏洞,可以导致Web应用程序中的远程代码执行。
部分分析结果可以在我们的RIPS 演示应用看到。请注意,我们将分析结果限制为本文所述的问题,以确保已经修复,RIPS 演示应用。
链式SQL注入和XSS
BigTree CMS存在普通的SQL注入,可在仪表板中利用它。未经过处理的参数允许覆盖Table
属性,从而允许对SQL语法进行操作,而导致从数据库中提取任意敏感信息。然后,Web应用程序继续打印通过SQL查询检索到的所有数据,并将其返回给经过身份验证的管理员。
由于BigTree此处未使用任何CSRF
令牌,因此可以通过CSRF
利用此漏洞。然后,可以使用二次跨站点脚本漏洞将数据外带到外部服务器。下面是该漏洞的入口点:
在第6行,通过form
参数接收用户输入并将其存储在$form
变量中。然后,将其值分配给BigTreeModule
实例的$m->Table
属性。最后,第10行中,该对象上调用执行SQL查询的get()
方法。此方法安全地嵌入$item
变量的用户输入,但不安全地嵌入受污染的Table
属性。
然后,可以利用跨站点脚本漏洞将数据外带。为了实现数据外带,攻击者必须控制SQL查询返回的$item
数组的值是以字符串http
开头。这将导致控制流图的分支走向链接自动处理,如下图中19行。
对于每个潜在的链接,程序将通过urlExists()
方法发送一个Web请求。如果请求失败,则将数据添加到第22行的错误数组$integrity_errors
中。该数组的值未经过滤就在30行的foreach
中进行输出,这就导致SQL注入的输出直接在我们的跨站点脚本有效负载旁边,从而将数据提取到外部服务器。尽管如此处所示,通过CSRF利用SQL注入通常很棘手,但在这种情况下,我们可以利用跨站点脚本漏洞利用AJAX
请求轻松外带数据。
通过CURL包装器进行phar反序列化
Curl
命令行的文件功能允许通过在文件名前添加@
符号实现从文件系统上传文件。在curl
命令行中添加-d param=@/path/to/filename
选项可以轻松地将指定文件名的内容上传到目标服务器。BigTree开发了自己的curl
包装函数BigTree::cURL()
来实现此功能。
该方法接收要在HTTP正文中发送的数据,作为静态方法的第二个参数$post
。第268行遍历数组并检查是否存在@
字符,该字符后可能带有文件名。在将文件内容添加到curl
请求之前,第270行file_exists()
检查此文件是否存在,如果我们可以控制$post
数组的值,则会导致phar
反序列化漏洞。通过URLhttp://<host>/bigtree446/site/index.php/admin/developer/services/instagram/return/?code=@phar://myphar.phar
可以证明我们的猜想是正确的,它将经过身份验证的后端用户直接路由到以下入口点:
存储在code
参数中的用户输入作为$code
参数传递给oAuthSetToken()
方法。这会将值从上面直接转发到BigTree::cURL()
包装器中,从而导致phar反序列化漏洞。
要利用此漏洞,必须上传文件。这只能通过正确传递CSRF令牌来实现。但是,可以通过上方利用Cross-Site Scripting
漏洞来窃取令牌。这就可以实现phar反序列化过程中使用的文件上传。
总结
在此博客文章中,我们看到手工清理每个参数是保护应用程序安全的繁琐而危险的方法。精明的攻击者可以链接多个漏洞,以成功发动具有针对性的攻击。建议花一些时间来开发和使用集中式安全模块,该模块将清理和数据库准备捆绑在一起。追溯实施安全功能时,自动化的安全测试可以帮助检测遗留代码遗留的漏洞。
时间线
日期 | 事件 |
---|---|
10/15/19 | 向BigTree报告漏洞细节 |
10/15/19 | 供应商确认问题 |
10/15/19 | 供应商发布BigTree 4.4.7补丁程序 |