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

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

缺陷编号:wooyun-2015-0132415

漏洞标题:YXcmsApp1.3.0补丁不当任意文件删除漏洞可getshell

相关厂商:yxcms.net

漏洞作者: 不能忍

提交时间:2015-08-14 15:09

修复时间:2015-11-17 15:10

公开时间:2015-11-17 15:10

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

图集处补丁修复不给力,仍然任意文件删除,可getshell。

详细说明:

WooYun-2015-118193 这个是我之前提交的。
漏洞文件:/protected/apps/member/controller/photocontroller.php
public function add()
{
if(!$this->isPost()){
$sortlist=model('sort')->select('','id,name,deep,tplist,path,norder,type');
if(empty($sortlist)) $this->error('请先添加图集栏目~',url('sort/photoadd'));
$sortlist=re_sort($sortlist);
foreach($sortlist as $vo){
if($this->checkConPower($vo['id'])){
$ct=explode(',',$vo['tplist']);
$tpco[$vo['path'].','.$vo['id']]=$ct[1];
$space = str_repeat('├┈┈┈', $vo['deep']-1);
$disable=($this->sorttype==$vo['type'])?'':'disabled="disabled" style="background-color:#F0F0F0"';
$option.= '<option '.$disable.' value="'.$vo['path'].','.$vo['id'].'">'.$space.$vo ['name'].'</option>';
}
}
$this->option=$option;
$this->tpc=json_encode($tpco);//默认模板处理
//$places=model('place')->select('','','norder DESC');//定位
// $this->places=$places;
$this->sortlist=$sortlist;
$this->type=$this->sorttype;
$this->twidth=config('thumbMaxwidth');
$this->theight=config('thumbMaxheight');
$this->picpath=__ROOT__.'https://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/photos/';
$this->display();
}else{
if(empty($_POST['sort'])||empty($_POST['title'])||empty($_POST['tpcontent']))
$this->error('请填写完整的信息~');
$data=array();
//扩展模型开始
if (!empty($_POST['tableid'])) {
$tableid = intval($_POST['tableid']);
$info = model('extend')->find("id='{$tableid}'",'tableinfo'); //查询表
$list = model('extend')->select("pid='{$tableid}'",'','id desc'); //查询表中字段
foreach ($list as $vo) {
if (!empty($vo['tableinfo'])) {
if(is_array($_POST['ext_'.$vo['tableinfo']]))
$fvalue=implode(',',$_POST['ext_'.$vo['tableinfo']]);
else
$fvalue=in($_POST['ext_'.$vo['tableinfo']]);
$ex_data[$vo['tableinfo']] = empty($fvalue)?$vo['defvalue']:$fvalue; //循环post字段
}
}
$extfield=model('extend')->Extin($info['tableinfo'],$ex_data);
$data['extfield']=$extfield;
}
//扩展模型结束
$data['account']=$this->mesprefix.$this->auth['account'];
$data['sort']=$_POST['sort'];
$data['exsort']=empty($_POST['exsort'])?'':implode(',',$_POST['exsort']);
$data['title']=in($_POST['title']);
$data['keywords']=in($_POST['keywords']);
$data['picture']=$_POST['picture'];
$data['description']=in($_POST['description']);
$data['content']=in($_POST['content']);
$data['method']='photo/content';
$data['tpcontent']=in($_POST['tpcontent']);
$data['ispass']=0;
$data['recmd']=0;
$data['hits']=0;
$data['norder']=0;
$data['addtime']=time();
// if (empty($data['description'])) {
// $data['description']=in(substr(deletehtml($_POST['content']), 0, 250)); //自动提取描述
// }
// if(empty($data['keywords'])){
// $data['keywords']= $this->getkeyword($data['title'].$data['description']); //自动获取中文关键词
// if(empty($data['keywords'])) $data['keywords']=str_replace(' ',',',$data['description']);//非中文
// }
// if($_POST['iftag']) {
// $iftag = $this->crtags($data['keywords']);
// if(!$iftag) $this->alert('标签生成失败~');
// }
if(!empty($_POST['photolist']))
$data['photolist']=implode(',',$_POST['photolist']); //photolist是用post传过来的。并没有过滤和验证
if(!empty($_POST['conlist']))
$data['conlist']=implode(',',in($_POST['conlist']));
if(model('photo')->insert($data))
$this->jump('图集添加成功~',url('photo/index'),'返回列表',url('photo/add'),'继续添加');
else $this->error('图集添加失败');
}
}
这个文件下还所有一个del函数:
public function delpic()
{
if(empty($_POST['picname'])) $this->error('参数错误~');
$picname=trim($_POST['picname']);
$picname=str_replace('../', '', $picname);
$picname=str_replace('./', '', $picname);
$path=$this->uploadpath;
$lasts=strtolower(substr($picname,-3));
if(in_array($lasts,array('gif','jpg','png','bmp'))){
if(file_exists($path.$picname)) @unlink($path.$picname);
else exit('图片不存在~');
if(file_exists($path.'thumb_'.$picname)) @unlink($path.'thumb_'.$picname);
else exit('缩略图不存在~');
echo '原图以及缩略图删除成功~';
}else echo $lasts;
}
这两行:
$picname=str_replace('../', '', $picname);
$picname=str_replace('./', '', $picname);
应该就是官方给出的修复补丁,然并卵。
参数构造:photolist[]=.....///.....///protected/apps/install/install.lock
这样还是能绕过补丁的!
利用方法跟之前一样:先注册一个用户,然后添加一个图集,添加的时候抓包。post加上这段:photolist[]=.....///.....///protected/apps/install/install.lock
添加成功之后再回到图集列表,删除添加的图集就可以了!
后台getshell我就不说了,之前的大牛提交过了!

漏洞证明:

1.jpg


2.jpg


3.jpg

修复方案:

其实不用$picname=str_replace('./', '', $picname);这样的
$picname=str_replace('.', '', $picname);这样就行了!

版权声明:转载请注明来源 不能忍@乌云


漏洞回应

厂商回应:

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

忽略时间:2015-11-17 15:10

厂商回复:

漏洞Rank:4 (WooYun评价)

最新状态:

暂无


漏洞评价:

评论