Zabbix软件被爆存在SQL注入漏洞,经过分析发现Zabbix默认开启了guest权限,且默认密码为空。随后Zabbix V3.0.4版本修复了2个SQL注入漏洞,本文对其公布的PoC进行分析,并给出检测及防护方案。
Zabbix公布了2个POC,如下:
- /zabbix/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get×tamp=1471054088083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=2’3297&updateProfile=true&screenitemid=&period=3600&stime=20170813040734&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color=1
- latest.php?output=ajax&sid=&favobj=toggle&toggle_open_state=1&toggle_ids[]=15385); select * from users where (1=1
以下为第一个poc的调用链:
Jsrpc.php:413 require_once dirname(__FILE__).'/include/page_footer.php';
include/page_footer.php:40 $result = CProfile::flush();
include/class/user/Cprofile.php:63 function flush()
include/class/user/Cprofile.php:277 function insertDB ()
再看第二个poc的调用链:
Latest.php:88 CProfile::update('web.latest.toggle_other', $_REQUEST['toggle_open_state'], PROFILE_TYPE_INT, $hostId);
Latest.php:829 require_once dirname(__FILE__).'/include/page_footer.php';
include/page_footer.php:40 $result = CProfile::flush();
include/class/user/Cprofile.php:63 function flush()
include/class/user/Cprofile.php:277 function insertDB ()
Zabbix SQL注入漏洞过程分析
以第一个调用链为例,我们来看文件
\zabbix-3.0.0beta2\frontends\php\jsrpc.php。
当method等于screen.get时,profileIdx2参数进入options中,然后options进入CScreenBuilder::getScreen($options),继续跟进文件\zabbix-3.0.0beta2\frontends\php\include\classes\screens\CScreenBuilder.php。
profileIdx2参数又进入CScreenBase::calculateTime()函数,继续跟进文件\zabbix-3.0.0beta2\frontends\php\include\classes\screens\CScreenBase.php。
profileIdx2参数又进入CProfile::update()函数中,继续跟进\zabbix-3.0.0beta2\frontends\php\include\classes\user\CProfile.php。
这里的profileIdx2参数就是这里的idx2,进入到profile中,然后profile进入insert中最后进入到insertDB()函数中。
insertDB中的处理过程如下:
insertDB函数中,对一些关键参数(idx,value),用zbx_dbstr()函数进行了过滤,但对idx2没有过滤,导致产生了sql注入漏洞。
分析过滤函数zbx_dbstr()函数,位于文件zabbix-3.0.0beta2\zabbix-3.0.0beta2\frontends\php\include\db.inc.php。
可以看到这个就是zabbix的全局过滤函数,根据各种数据库类型,过滤sql注入的。
从开始到最后进入sql语句中的参数有三个:$options['profileIdx']、$options['period']、$options['profileIdx2'],只有$options['profileIdx2']全程没有过滤,直接进入sql语句中。
看官方的3.0.4修复版本的Cprofile::insertDB函数,其关键参数idx2也做了过滤,如下图:
当然,要使请求最终到达这个漏洞函数,中间还有一些限制条件,主要看Cprofile::flush函数,如下:
$profiles和$isModified()都会在前面的update()函数内会保证为真,而要满足userDeatails[‘suerid’]>0,则需要用户登录或系统开启guest模式。
Zabbix SQL注入漏洞检测及防护方案
监控系统监控着每个企业的核心资产,一旦被黑客入侵控制,等同为黑客进一步渗透企业敞开了大门。绿盟科技针对此次漏洞提供了以下解决方案:
1、对于受影响的版本,建议升级到最新版本,获取地址:
http://www.zabbix.com/download.php
2、禁用访客账户,例如Windows下的guest账户
3、绿盟科技免费在线检测:
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?pid=0&sid=1
4、绿盟科技在线云检测,登陆绿盟科技云,申请极光自助扫描服务试用:
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?pid=0&sid=0
5、使用绿盟科技的远程评估系统(RSAS/WVSS)对内网进行安全评估,RSAS插件升级包获取地址: http://update.nsfocus.com/update/listRsasDetail/v/vulweb ,WVSS插件升级包获取地址: http://update.nsfocus.com/update/listWvssDetail/v/6/t/plg
6、使用绿盟科技检测类产品(IDS)进行检测,各版本对应升级包分别为 5.6.10.14273 、 5.6.9.14273 、 5.6.8.594、 5.6.7.594 、 5.6.0.500
7、使用绿盟科技防护类产品(IPS/NF/SG)进行防护,各版本对应升级包分别为 5.6.10.14273 、 5.6.9.14273 、 5.6.8.594 、 5.6.7.594 、 5.6.0.500
8、已经购买了绿盟科技相关服务的客户可与售后联系,进行检测与防护
9、短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,并提供事件分析报告
10、中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发
11、长期服务:基金行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)