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

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

缺陷编号: WooYun-2014-77803

漏洞标题: CuuMall最新版任意文件包含

相关厂商: cuumall.com

漏洞作者: 路人甲

提交时间: 2014-09-29 18:16

公开时间: 2014-12-25 18:18

漏洞类型: 文件包含

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: php源码审核

3人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-29: 细节已通知厂商并且等待厂商处理中
2014-10-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-11-28: 细节向核心白帽子及相关领域专家公开
2014-12-08: 细节向普通白帽子公开
2014-12-18: 细节向实习白帽子公开
2014-12-25: 细节向公众公开

简要描述:

CuuMall免费网上商城系统基于企业级MVC技术架构,安全、稳定,可保证同时在线人数达10000人左右,能适应不同领域的公司企业,文件缓存机制、数据库缓存机制,保证系统稳定运行,多种功能以满足不同客户网上开店的需求。

详细说明:

code 区域
//执行应用程序
static public function exec()
{
// 是否开启标签扩展
$tagOn = C('APP_PLUGIN_ON');
// 项目运行标签
if($tagOn) tag('app_run');

//创建Action控制器实例
$group = defined('GROUP_NAME') ? GROUP_NAME.C('APP_GROUP_DEPR') : '';
$module = A($group.MODULE_NAME);
...
}

//这里 MODULE_NAME这个是当前的module,可以用post参数m传入,并且没有做任何过滤。


function A($name,$app='@')
{
static $_action = array();
if(isset($_action[$app.$name]))
return $_action[$app.$name];
$OriClassName = $name;
if(strpos($name,C('APP_GROUP_DEPR'))) {
$array = explode(C('APP_GROUP_DEPR'),$name);
$name = array_pop($array);
$className = $name.'Action';
import($app.'.Action.'.implode('.',$array).'.'.$className);
}else{
$className = $name.'Action';
import($app.'.Action.'.$className);
}
if(class_exists($className)) {
$action = new $className();
$_action[$app.$OriClassName] = $action;
return $action;
}else {
return false;
}
}

//这里执行加载模块功能:import($app.'.Action.'.implode('.',$array).'.'.$className);





code 区域
function import($class,$baseUrl = '',$ext='.class.php')
{
static $_file = array();
static $_class = array();
$class = str_replace(array('.','#'), array('/','.'), $class);
if('' === $baseUrl && false === strpos($class,'/')) {
// 检查别名导入
return alias_import($class);
} //echo('<br>'.$class.$baseUrl);
if(isset($_file[$class.$baseUrl]))
return true;
else
$_file[$class.$baseUrl] = true;
$class_strut = explode("/",$class);
if(empty($baseUrl)) {
if('@'==$class_strut[0] || APP_NAME == $class_strut[0] ) {
//加载当前项目应用类库
$baseUrl = dirname(LIB_PATH);
$class = str_replace(array(APP_NAME.'/','@/'),LIB_DIR.'/',$class);
}elseif(in_array(strtolower($class_strut[0]),array('think','org','com'))) {
//加载ThinkPHP基类库或者公共类库
// think 官方基类库 org 第三方公共类库 com 企业公共类库
$baseUrl = THINK_PATH.'/Lib/';
}else {
// 加载其他项目应用类库
$class = substr_replace($class, '', 0,strlen($class_strut[0])+1);
$baseUrl = APP_PATH.'/../'.$class_strut[0].'/'.LIB_DIR.'/';
}
}
if(substr($baseUrl, -1) != "/") $baseUrl .= "/";
$classfile = $baseUrl . $class . $ext;
if($ext == '.class.php' && is_file($classfile)) {
// 冲突检测
$class = basename($classfile,$ext);
if(isset($_class[$class]))
throw_exception(L('_CLASS_CONFLICT_').':'.$_class[$class].' '.$classfile);
$_class[$class] = $classfile;
}
//导入目录下的指定类库文件
return require_cache($classfile);
}



这里先将$class 的.替换成/,#替换成.号。这样我们可以传入的时候用##/就可以达到目录切换。

后面又做了一次$class = str_replace(array(APP_NAME.'/','@/'),LIB_DIR.'/',$class);其中APP_NAME的值是点号, 这样./会被替换掉。但是在windows下可以利用\代替/以达到绕过。

最后return require_cache($classfile);直接包含文件。



POC: m=%23%23\%23%23\%23%23\info%23php%00 (info.php是网站自带的)





漏洞证明:

BaiduHi_2014-9-29_16-58-12.png

修复方案:

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-12-25 18:18

厂商回复:

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-09-30 09:25 | menmen519 ( 普通白帽子 | Rank:914 漏洞数:161 | http://menmen519.blog.sohu.com/)
    0

    这个东西 我老早之前看过 怎么zend 反编译不出来

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