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

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

缺陷编号:wooyun-2015-0109211

漏洞标题:cmseasy最新版 一枚注入

相关厂商:cmseasy

漏洞作者: 玉林嘎

提交时间:2015-04-21 17:22

修复时间:2015-07-20 17:26

公开时间:2015-07-20 17:26

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

可惜没绕过360webscan(其实是轻松绕过的)

详细说明:

cmseasy最新版0318 存在一个注入
漏洞文件:/lib/default/archive_act.php
250-251行:

function search_action() {//print_r($_SESSION);exit();
if (front::get('ule')) {
front::$get['keyword'] = str_replace('-', '%', front::$get['keyword']);
front::$get['keyword'] = urldecode(front::$get['keyword']);
}
if (front::get('keyword') && !front::post('keyword'))
front::$post['keyword'] = front::get('keyword');
front::check_type(front::post('keyword'), 'safe');
if (front::post('keyword')) {
$this->view->keyword = trim(front::post('keyword'));
session::set('keyword', trim(front::post('keyword')));
/* if(isset(front::$get['keyword']))
front::redirect(preg_replace('/keyword=[^&]+/','keyword='.urlencode($this->view->keyword),front::$uri));
else front::redirect(front::$uri.'&keyword='.urlencode($this->view->keyword)); */
} else {
$this->view->keyword = session::get('keyword');
}

if(preg_match('/union/i',$this->view->keyword) || preg_match('/"/i',$this->view->keyword) ||preg_match('/\'/i',$this->view->keyword)){
exit('非法参数');
}


重要代码:

if (front::get('ule')) {
front::$get['keyword'] = str_replace('-', '%', front::$get['keyword']);
front::$get['keyword'] = urldecode(front::$get['keyword']);
}


get获取的ule存在即可进入这个条件语句
- 变成 % 之后urldecode
导致可以直接引入' 只需传入-27即可
再看

session::set('keyword', trim(front::post('keyword')));


对应函数代码:

class session {
static function get($key) {
if (isset($_SESSION[$key]))
return $_SESSION[$key];
else
return false;
}
static function set($key,$var) {
$_SESSION[$key]=$var;
}
static function del($key) {
unset($_SESSION[$key]);
}
}
//session_start();


cmseasy在赋予session值后 会进行一个write操作
/lib/plugins/stsession.php

public function write($id,$data) {
$sql = "SELECT * FROM {$this->_prefix}sessionox where PHPSESSID = '$id'";
//var_dump($sql);
$res = $this->_db->query($sql);
$time = time();
$row = $this->_db->fetch_array($res);
if ($row) {
//if ($row['data'] != $data) {
$sql = "UPDATE {$this->_prefix}sessionox SET update_time='$time',data='$data' WHERE PHPSESSID = '$id'";
$this->_db->query($sql);
//}
} else {
if (!empty($data)) {
$sql = "INSERT INTO {$this->_prefix}sessionox (PHPSESSID, update_time, client_ip, data) VALUES ('$id','$time','$this->_ip','$data')";
$this->_db->query($sql);
}
}
return true;
}


$data数据进入update操作 造成注入
而之后参数preg_match是在数据库操作之后 并无影响

if(preg_match('/union/i',$this->view->keyword) || preg_match('/"/i',$this->view->keyword) ||preg_match('/\'/i',$this->view->keyword)){
exit('非法参数');
}


而拦截白名单也做出更改了 想不到办法绕过360webscan

/**
* 拦截目录白名单
*/
function webscan_white($webscan_white_name,$webscan_white_url=array()) {
$url_path=$_SERVER['SCRIPT_NAME'];
foreach($_GET as $key=>$value){
$url_var.=$key."=".$value."&";
}
if (preg_match("/".$webscan_white_name."/is",$url_path)==1&&!empty($webscan_white_name)) {
return false;
}
foreach ($webscan_white_url as $key => $value) {
if(!empty($url_var)&&!empty($value)){
if (stristr($url_path,$key)&&stristr($url_var,$value)) {
return false;
}
}
elseif (empty($url_var)&&empty($value)) {
if (stristr($url_path,$key)) {
return false;
}
}
}
return true;
}

漏洞证明:

证明一下存在注入
http://127.0.0.1/cmseasy/index.php?case=archive&act=search&keyword=-27,client_ip=user()-23&ule=1

1.jpg


2.png


绕过了360webscan就可以直接盲注了

修复方案:

版权声明:转载请注明来源 玉林嘎@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2015-04-21 17:24

厂商回复:

谢谢,马上修正

最新状态:

暂无