×

扫描二维码登录本站

标签: 暂无标签
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)即可。
安全狗原创


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x




上一篇:应如何操作Zabbix的编译安装并发送通知邮件
下一篇:从代码级别优化Zabbix的数据展现性能
monicazhang

写了 2297 篇文章,拥有财富 12859,被 21 人关注

您需要登录后才可以回帖 登录 | 立即注册
B Color Link Quote Code Smilies

成为第一个吐槽的人

Powered by ITIL  © 2001-2025
返回顶部