译者:WisFree
预估稿费:200RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
SugarCRM审计出多种安全问题
SugarCRM是当前比较热门的一款客户关系管理解决方案,SugarCRM目前主要有两大版本,即需要付费的商业版以及开源的社区版,目前总共有超过一百二十多个国家和地区的两百多万独立用户正在使用SugarCRM来管理敏感的客户数据。
但是就在前不久,有一名安全研究人员报告称SugarCRM的代码中存在多处安全问题,而SugarCRM的安全性问题也逐渐引起了社区里其他安全研究人员的注意。为此,SugarCRM也发布了新的版本以解决其中存在的安全问题。
我们此前曾对代码进行了人工审计,但我们还希望看看我们的自动化代码分析技术RIPS【参考资料】能给软件的安全性带来怎样的贡献。通过分析后,我们扫描出了几个非常严重的安全问题,而这些安全漏洞将允许攻击者从服务器中窃取客户数据或其他的敏感文件。
我们使用RIPS分析了开源的SugarCE版本(最新版本6.5.26,该版本与商业版本SugarCRM共享基础代码),我们在八分钟之内对总共816519行代码以及软件数据流进行了安全性分析。接下来,我们将在本文中给大家介绍其中最有意思的几个发现。需要注意的是,我们已经将相关问题上报给了厂商,并且厂商现已修复了本文所涉及到的所有安全问题(通过更新补丁实现)。
多步PHP对象注入漏洞
RIPS所检测到的最严重的安全漏洞存在于DetailView模块中。在绝大多数情况下,SugarCRM仅仅只会使用securexss()函数来防止攻击者绕过SQL模板常量并注入非预置的SQL语句。这个函数负责用相应的HTML实体替换掉语句中的单引号,并防止注入的发生。但是,securexss()函数并不会替换输入语句中的反斜杠字符。因此,除了利用反斜杠来绕过securexss()之外,我们还发现了之前存在的XSS问题,接下来我们一起看看这些问题将如何从SQL查询语句中体现:
modules/Emails/DetailView.php
$parent_id = $_REQUEST['parent_id'];
// cn: bug 14300 - emails_beans schema refactor - fixing query
$query="SELECT * FROM emails_beans WHERE email_id='{$focus->id}'
AND bean_id='{$parent_id}'
AND bean_module = '{$_REQUEST['parent_module']}' " ;
$res=$focus->db->query($query);
$row=$focus->db->fetchByAssoc($res);
if (!empty($row)) {
$campaign_data = $row['campaign_data'];
$macro_values = array();
if (!empty($campaign_data)) {
$macro_values = unserialize(from_html($campaign_data));
}
}
在DetailView模块中,查询语句是使用用户输入数据动态构建生成的,其中的单引号是经过了替换处理的。如果用户提供的数据并非恶意数据,那么正常构建出的SQL查询语句将如下所示。在下面这条查询语句中,单引号内的字符串将会被转译成SQL字符串:
SELECT * FROM emails_beans WHERE email_id='123' AND bean_id='abc' AND bean_module='def'
但是,如果我们在bean_id的结尾部分添加一个反斜杠字符的话,会发生什么呢?
SELECT * FROM emails_beans WHERE email_id='123' AND bean_id='abc' AND bean_module='def'
此时,第二个AND条件将会被bean_id内的字符串给过滤掉,所以bean_id内内容将会扩展到剩下的SQL语句(下一个单引号之前),因此bean_module之后的值就会变成用户可控制的值了。此时,攻击者将能够在不需要破坏之前单引号的情况下注入任意的SQL语句了,而此时SugarCRM所部属的安全防护措施也将会被绕过。(sugarcrm-sa-2017-006)
除此之外,SQL查询语句所获取到得campaign_data是经过了unserialize()函数处理过的,而这将触发一个PHP对象注入漏洞,这是一种非常严重的安全问题,我在我们之前的文章中也已经反复讨论过多次了。【参考资料一】【参考资料二】
SELECT * FROM emails_beans WHERE email_id='123' AND bean_id='abc' AND bean_module='
UNION ALL SELECT 1,2,3,4,CHAR(76,76),6,7 FROM emails_beans LIMIT 1 -- x'
CSRF + SQL盲注
之前所介绍的SQL注入漏洞以及我们所报告的另一个SQL注入漏洞只能通过一个有效的用户会话进行访问。除了这两个漏洞之外,我们还发现了一个SQL盲注漏洞,这也就意味着我们不会在HTML响应页面中看到SQL响应信息或任何的错误提示。但是,攻击者可以在不需要获取任何用户凭证的情况下在后台远程利用该漏洞实施攻击,所以攻击者不用再去欺骗用户访问恶意Web页面并获取用户的合法凭证了。下面给出的是一份恶意页面演示样例:
视频地址:https://blog.ripstech.com/videos/sugarcrmsqliblindly.webm
在我们的演示样例中,我们使用JavaScript动态加载了一张图片,并将其URL属性所指向的目标设为了SugarCRM的安装程序,而这将允许攻击者以认证用户的名义发送请求。URL属性将包含一个SQL Payload,并向后端发送指令以延迟数据库的部分内容相应。
SQL查询的响应时间是一名攻击者必须要去区分的内容,我们也已经在我们的PoC中演示了如何从基于时间的SQL注入中提取有效信息。这里需要注意的是,信息的提取速度是可以通过优化从而得到大幅度提升的。
认证文件泄露
成功利用SQL注入漏洞并破解了目标系统的管理员密码之后,攻击者将能够访问到存储在SugarCRM数据库中的所有客户数据。但是除了这些之外,一名经过身份认证的用户还能够做到哪些事情呢?实际上,无论是商业版或是开源版的SugarCRM,两者其实都存在文件披露漏洞,而这种漏洞将允许攻击者远程读取目标服务器中的任意文件内容。(sugarcrm-sa-2017-007)
modules/Connecors/controller.php
function action_CallRest() {
if(false === ($result = @file_get_contents($_REQUEST['url']))){
echo '';
} else {
echo $result;
}
}
请大家先看看上面给出的这段代码,其中的url参数主要是用来对数据进行过滤的,因为PHP的file_get_contents()函数中的文件名将允许攻击者检索或下载任意文件(只要文件系统允许)。当一名经过身份验证的攻击者访问了如下所示的URL地址之后,他将能够查看到/etc/passwd文件中保存的敏感内容:
/index.php?…&module=CallRest&url=/etc/passwd[object Object]
时间轴
2017年06月06日:报告漏洞细节
2017年06月27日:询问报告状态
2017年07月01日:厂商正在努力修复相关漏洞
2017年09月12日:厂商正式发布SugarCRM的修复版本
总结
这篇文章的主角就是目前十分热门的客户关系管理软件SugarCRM,我们对开源版本的SugarCRM进行了分析,虽然我们之前已经对相关源码进行了一次人工安全审计,但是我们的代码分析解决方案(RIPS)仍然检测到了几个之前没有被发现的安全问题,而这些安全问题甚至还会影响商业版本的SugarCRM。导致这些安全问题产生的根本原因主要是因为其中的全局输入过滤函数无法对不同类型的标记文本进行安全处理。
攻击者一旦成功利用了这些漏洞,那么他们将能够远程窃取服务器端存储的客户数据以及敏感文件。不过大家不必担心,我们已经将所有已发现的安全漏洞上报给了SugarCRM的安全团队,而且所有漏洞现已成功修复,所以请广大用户尽快将自己的SugarCRM升级至最新版本。
参考资料
1.https://www.ripstech.com/code-review-features/
2.https://www.sugarcrm.com/about
3.http://karmainsecurity.com/tales-of-sugarcrm-security-horrors