zabbix多版本注入漏洞分析
Posted 安全狗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zabbix多版本注入漏洞分析相关的知识,希望对你有一定的参考价值。
Seclists上爆出zabbix多版本无需登陆的注入,然后国内就爆炸了。开头先说一下,安全狗能够拦截这个注入攻击。
来分析一下吧,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
通过页面的语句报错定位代码位置在\includes\profiles.inc.php中第174行
代码中将value数组通过implode函数操作并组装成sql语句。通过报错信息中可以发现触发点在idx2参数中。(在最新版本中的zabbix已经使用zbx_dbstr对idx2变量进行单引号保护与转义。)
向上查找发现flush函数对insertDB进行了调用。
代码中通过判断私有变量是否为空,不为空则遍历变量并传入insertDB函数中,可以看到在遍历时并没有做任何过滤的操作。
接着在代码中搜索何处对CProfile::flush()函数进行调用,在\includes\page_footer.php中第46行调用了该函数,最后在jsrpc.php中的最后一行引入page_footer.php。
至此,整个函数的调用流程分析完成,接下来通过payload开始分析profileIdx2参数变量的组装与传递流程。
在jsrpc.php中178-219行,method=screen.get中
代码前半部将$_REQUEST获取的变量进行组装,然后传入CScreenBuilder::getScreen()中。
紧接着找到\includes\classes\screens\CScreenBuilder.php,getScreen()函数被定义在169-268行。
第197行开始判断传入的resourcetype参数并实例化对应的类,对应的类继承于CScreenBase类,并调用父类的构造函数。
在CScreenBase->__construct中,可以看到函数对变量赋值完成后传入了$this->calculateTime方法中。
代码中可以看到除了判断传入的变量外,函数在未过滤变量的情况下传入了CProfile::update()中。
代码在\includes\profiles.inc.php中136-172行
函数直接将传入的变量传入到私有变量,用于后面CProfile::flush()的调用(文章开头部分),最终导致注入的发生。
修复方案:
Zabbix 2.x找到\includes\profiles.inc.php文件,Zabbix 3.x找到\include\classes\user\CProfile.php,将insertDB函数中的'idx2' => $idx2改成'idx2' =>zbx_dbstr($idx2)即可。
参考:
http://seclists.org/fulldisclosure/2016/Aug/82
点击图片查看近期热点
看ISC技术论坛上专家们如何解读“威胁情报”
2016互联网安全大会 一场解封“洪荒之力”的大戏持续上演
你家收到信息安全等级保护限期整改通知书了吗?
恐怖袭击和寨卡病毒算什么? 这才是“里约大冒险”最难过的关卡
安全狗,知名互联网安全品牌,领先的云安全服务与解决方案提供商。秉承“安全狗即服务”的理念,依托全球领先的安全技术与完善的大数据处理平台,帮助客户实现业务平台的安全、稳定、可靠运行。
以上是关于zabbix多版本注入漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章
zabbix 爆高危 SQL 注入漏洞,可获系统权限(profileIdx 2 参数)