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

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

缺陷编号: WooYun-2014-61639

漏洞标题: 易酷cms本地包含导致getwebshell(ThinkPHP)

相关厂商: ekucms.com

漏洞作者: Bhunter

提交时间: 2014-05-22 15:10

公开时间: 2014-08-20 15:12

漏洞类型: 文件包含

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 文件包含漏洞 模板文件操作参数未过滤

13人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

通过本地包含直接getwebshell,直接控制整个网站权限。

详细说明:

漏洞文件:core\Lib\Action\Home\MyAction.class.php

code 区域
<?php
class MyAction extends HomeAction{
public function index(){
$this->show();
}
public function show(){
$id = !empty($_GET['id'])?$_GET['id']:'hot';
$this->display('my_'.trim($id));漏洞点
}
}
?>





包含点:

code 区域
public function fetch($templateFile='',$charset='',$contentType='text/html',$display=false)
{
$GLOBALS['_viewStartTime'] = microtime(TRUE);
if(null===$templateFile)
// 使用null参数作为模版名直接返回不做任何输出
return ;
if(empty($charset)) $charset = C('DEFAULT_CHARSET');
// 网页字符编码
header("Content-Type:".$contentType."; charset=".$charset);
header("Cache-control: private"); //支持页面回跳
//页面缓存
ob_start();
ob_implicit_flush(0);

if(!file_exists_case($templateFile))
// 自动定位模板文件
$templateFile = $this->parseTemplateFile($templateFile);//关键函数,只有此处对包含模板做了文件处理,我看看下这个函数。

$engine = strtolower(C('TMPL_ENGINE_TYPE'));
if('php'==$engine) {
// 模板阵列变量分解成为独立变量
extract($this->tVar, EXTR_OVERWRITE);
// 直接载入PHP模板
include $templateFile;
}elseif('think'==$engine && $this->checkCache($templateFile)) {
// 如果是Think模板引擎并且缓存有效 分解变量并载入模板缓存
extract($this->tVar, EXTR_OVERWRITE);
//载入模版缓存文件
include C('CACHE_PATH').md5($templateFile).C('TMPL_CACHFILE_SUFFIX');
}else{
// 模板文件需要重新编译 支持第三方模板引擎
// 调用模板引擎解析和输出
$className = 'Template'.ucwords($engine);
require_cache(THINK_PATH.'/Lib/Think/Util/Template/'.$className.'.class.php');
$tpl = new $className;
$tpl->fetch($templateFile,$this->tVar,$charset);
}
$this->templateFile = $templateFile;
// 获取并清空缓存
$content = ob_get_clean();
// 模板内容替换
$content = $this->templateContentReplace($content);
// 布局模板解析
$content = $this->layout($content,$charset,$contentType);
// 输出模板文件
return $this->output($content,$display);
}



对包含文件处理:

code 区域
private function parseTemplateFile($templateFile) {
if(''==$templateFile) {
// 如果模板文件名为空 按照默认规则定位
$templateFile = C('TMPL_FILE_NAME');
}elseif(strpos($templateFile,'@')){
// 引入其它主题的操作模板 必须带上模块名称 例如 blue@User:add
$templateFile = TMPL_PATH.str_replace(array('@',':'),'/',$templateFile).C('TMPL_TEMPLATE_SUFFIX');
}elseif(strpos($templateFile,':')){
// 引入其它模块的操作模板
$templateFile = TEMPLATE_PATH.'/'.str_replace(':','/',$templateFile).C('TMPL_TEMPLATE_SUFFIX');
}elseif(!is_file($templateFile)) {
// 引入当前模块的其它操作模板
$templateFile = dirname(C('TMPL_FILE_NAME')).'/'.$templateFile.C('TMPL_TEMPLATE_SUFFIX');
}
if(!file_exists_case($templateFile))
throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']');
return $templateFile;
}





有了包含点,我们需要一个含有我们恶意代码的文件,我们利用thinphp的错误日志记录功能:

制造错误:

1.jpg



日志文件:

2.jpg



漏洞证明:

利用上边说道的两个功能:

1.包含任意文件

2.错误写入日子

3.结合thinkphp的模板语法构造一句话为:{~eval($_POST[x])}



写入一句话:

制造错误:

1.jpg



日志文件:

2.jpg



包含一句话:

3.jpg



菜刀链接:

4.jpg

修复方案:

对于程序修复问题,如果从二次开发者的角度说,不应该让模板参数可控。

对于thinkphp的角度,在模板文件名和路径处理上需要更加完善。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-05-22 16:14

厂商回复:

感谢提交,我们将通知用户修复此漏洞。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-05-21 13:03 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:52 | ☯☯☯☯☯☯☯☯☯☯)
    0

    一库一库~

  2. 2014-06-11 16:31 | luwikes ( 普通白帽子 | Rank:548 漏洞数:71 | 潜心学习~~~)
    0

    @寂寞的瘦子 。。

  3. 2014-06-11 17:10 | Black Angel ( 普通白帽子 | Rank:165 漏洞数:35 | 最神奇的一群人,智慧低调又内敛,俗称马甲...)
    0

    @寂寞的瘦子 瞎子

  4. 2016-04-11 23:28 | echotxl ( 路人 | Rank:8 漏洞数:4 | 我是一枚纯粹的业余菜鸟。。。)
    1

    厉害

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