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

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

缺陷编号: WooYun-2014-53198

漏洞标题: cmseasy绕过补丁SQL注入一枚

相关厂商: cmseasy

漏洞作者: ′雨。认证白帽子

提交时间: 2014-03-09 20:40

公开时间: 2014-06-07 20:41

漏洞类型: SQL注射漏洞

危害等级: 中

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

继续注入。

详细说明:

在lib\plugins\pay\alipay.php中。



上次提了这个文件的洞。

看了看官网发的补丁。



code 区域
foreach($_POST as $key =>$data) {
if(preg_match('/(=|<|>)/', $data)){
return false;
}





就是过滤了几个运算符。 但是因为语句是 where xxx。

一般的注入的话 需要where id=xxx 来注入 但是这里过滤了这些。 没想出什么办法突破。



但是在这文件 还有一个函数。



code 区域
$payment  = pay::get_payment($_GET['code']);
$seller_email = rawurldecode($_GET['seller_email']);
$order_sn = str_replace($_GET['subject'],'',$_GET['out_trade_no']);
$order_sn = trim($order_sn);
if (!pay::check_money($order_sn,$_GET['total_fee'])) {
return false;
}

if($_GET['trade_status'] == "WAIT_SELLER_SEND_GOODS"||$_GET['trade_status'] == "TRADE_FINISHED" || $_GET['trade_status'] == "TRADE_SUCCESS") {

pay::changeorders($order_sn,$_GET);
return true;
}else {
return false;
}





上次是看的changeorders 现在 反正我是没办法利用了。



那现在来看看check_money



code 区域
public static function check_money($id,$money) {


$where=array();
$where['id']=$id;

$orders=orders::getInstance()->getrow($where);
$archive=archive::getInstance()->getrow($orders['aid']);

$prices = getPrices($archive['attr2']);
$archive['attr2'] = $prices['price'];





可以看到是把order_sn 带入了getrow; 再继续

code 区域
function getrow($condition,$order='1 desc',$cols='*') {

$this->condition($condition);


return $this->rec_select_one($condition,'*',$order);





code 区域
function sql_select($tbname,$where="",$limit=0,$fields="*",$order='') {
$sql="SELECT ".$fields." FROM `".$tbname."` ".($where ?" WHERE ".$where : "")." ORDER BY ".$order.($limit ?" limit ".$limit : "");
//echo $sql."<br>";
return $sql;





这里来把语句输出一下看看。

SELECT * FROM `cmseasy_p_orders` WHERE `id`='123aaaa'

被单引号了。 但是又全局转义 怎么办呢?

看 $order_sn = str_replace($_GET['subject'],'',$_GET['out_trade_no']);

$order_sn = trim($order_sn);

这里跟ecshop 那个洞挺像。

在这里 有一个replace 是xx把清空 但是这个xxx是我们可控的。

总所周知 %00 转义后会变成\0 然后%00' 就是\0\'

这里 如果我们把0清空 的话 就成了\\' 单引号成功出来。



测试测试。



漏洞证明:

cmseasy.jpg





执行的语句有点多。。 直接全部输出来了。



是成功的哦。

修复方案:

继续过滤。



这次别忽略了。。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-03-09 20:43

厂商回复:

感谢,马上更新

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-03-16 12:08 | skysheep ( 路人 | Rank:0 漏洞数:1 | 关注网络安全。)
    0

    哇哇哇哇哇。这个好。

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