安全狗:zabbix多版本注入漏洞分析

本文分析了Zabbix监控系统中无需登录的SQL注入漏洞,详细解析了攻击payload的构造方式及漏洞产生的原因。介绍了从攻击payload定位到代码的具体过程,并提出了修复建议。

Seclists上爆出zabbix多版本无需登陆的注入,然后国内就爆炸了。开头先说一下,安全狗能够拦截这个注入攻击。

25163022_kJfr.png

来分析一下吧,zabbix版本为2.x

攻击payload如下:

jsrpc.php?type=9&method=screen.get&profileIdx=web.item.graph&profileIdx2=1%20and%20(select%201%20from%20(select%20count(*),concat(user(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)&stime=1&resourcetype=1

25163022_Y3MN.png

通过页面的语句报错定位代码位置在\includes\profiles.inc.php中第174行

25163022_lrhL.png

代码中将value数组通过implode函数操作并组装成sql语句。通过报错信息中可以发现触发点在idx2参数中。(在最新版本中的zabbix已经使用zbx_dbstr对idx2变量进行单引号保护与转义。)

向上查找发现flush函数对insertDB进行了调用。

25163022_Gojr.png

代码中通过判断私有变量是否为空,不为空则遍历变量并传入insertDB函数中,可以看到在遍历时并没有做任何过滤的操作。

接着在代码中搜索何处对CProfile::flush()函数进行调用,在\includes\page_footer.php中第46行调用了该函数,最后在jsrpc.php中的最后一行引入page_footer.php。

至此,整个函数的调用流程分析完成,接下来通过payload开始分析profileIdx2参数变量的组装与传递流程。

在jsrpc.php中178-219行,method=screen.get中

25163022_53Fy.png代码前半部将$_REQUEST获取的变量进行组装,然后传入CScreenBuilder::getScreen()中。

紧接着找到\includes\classes\screens\CScreenBuilder.php,getScreen()函数被定义在169-268行。

25163022_jlm0.png第197行开始判断传入的resourcetype参数并实例化对应的类,对应的类继承于CScreenBase类,并调用父类的构造函数。

25163022_zAy9.png

在CScreenBase->__construct中,可以看到函数对变量赋值完成后传入了$this->calculateTime方法中。

25163022_t0Vz.png

代码中可以看到除了判断传入的变量外,函数在未过滤变量的情况下传入了CProfile::update()中。

代码在\includes\profiles.inc.php中136-172行

25163022_PLC7.png

函数直接将传入的变量传入到私有变量,用于后面CProfile::flush()的调用(文章开头部分),最终导致注入的发生。

修复方案:

Zabbix 2.x找到\includes\profiles.inc.php文件,Zabbix 3.x找到\include\classes\user\CProfile.php,将insertDB函数中的

'idx2' => $idx2改成'idx2' =>zbx_dbstr($idx2)即可。

Reference:

http://seclists.org/fulldisclosure/2016/Aug/82

转载于:https://my.oschina.net/safedog/blog/737848

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值