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

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

缺陷编号:wooyun-2014-076875

漏洞标题:YXCMS1.2.6版本1处任意文件删除+6处越权操作

相关厂商:yxcms.net

漏洞作者: linadmin

提交时间:2014-09-23 11:59

修复时间:2014-12-22 12:00

公开时间:2014-12-22 12:00

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-23: 细节已通知厂商并且等待厂商处理中
2014-09-23: 厂商已经确认,细节仅向厂商公开
2014-09-26: 细节向第三方安全合作伙伴开放
2014-11-17: 细节向核心白帽子及相关领域专家公开
2014-11-27: 细节向普通白帽子公开
2014-12-07: 细节向实习白帽子公开
2014-12-22: 细节向公众公开

简要描述:

YXCMS1.2.6版本1处任意文件删除+6处越权操作

详细说明:

经过简单的审计发现YXcms一处任意文件删除漏洞(不是wooyun上已经提交过的)和多处越权操作(只举出一例作为证明)
1. 任意文件删除漏洞
出这个漏洞的代码位于/protected/apps/member/controller/newsController.php的
delcover函数中:
public function delcover()
{
//文件保存目录
$id=in($_POST['id']);
$pic=in($_POST['pic']);
$data['picture']= $this->nopic;
if(model('news')->update("id='$id'",$data)){
$picpath=$this->uploadpath.$pic;
if(file_exists($picpath)) @unlink($picpath);
echo 1;
}else echo '删除封面失败~';
}
这个函数可以通过控制参数进行调用
http://localhost/yxcms/index.php?r=member/news/delcover
unlink函数参数$picpath中引入了$pic
$pic参数来源于$_POST['pic']
因为过滤函数in并没有对其进行严格的过滤控制,可以输入”../../../../”这类的字符串进行目录切换。
接下来就是要想办法满足条件执行unlink函数。
(因为这个模块是需要登录的,首先注册一个用户登陆)
Unlink函数能够执行有两个条件
1. if(model('news')->update("id='$id'",$data))
2. file_exists($picpath)
第二个条件就不说了。。。
第一个条件要求能够在update执行数据库操作的时候对数据有影响。
这里我直接打印一下$this->nopic看看是什么

1.png


是NoPic.gif。接下来,看一下数据库news这个表里面的picture字段(默认安装的数据)这个的意思就是新闻里面有没有图片封面,这个实际使用中是肯定有的,真实利用的时候我甚至可以用爆破的方法~~我以测试数据为例:

2.png


可以看到很多picture字段不是NoPifc.gif,这些picture对应的id都是能够导致这个漏洞可以被触发的参数,只需要把url post变量中id这个参数赋值为这些id值就能够成功触发。做一下测试,首先我在网站根目录下放置一个123.txt

3.png


然后点击执行:

4.png


可见文件已经被删除,具体的你们可以自己测试,有问题可以联系我邮箱franklin1990@126.com
至于这个漏洞危害性我就不说了,删掉lock文件,重装网站事小,删掉重要数据或文件就麻烦了,你懂的。
2.多处越权操作
我在查看YXcms多个文件的时候发现了多处越权操作,列一下:
1. Protected/apps/member/controller/inforController.php的index函数
if(!$this->isPost()){
$auth=$this->auth;
$id=$auth['id'];
$info=model('members')->find("id='{$id}'");
$this->info=$info;
$this->path=__ROOT__.'https://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/member/image/';
$this->twidth=config('HEAD_W');
$this->theight=config('HEAD_H');
$this->display();
}else{
$id=intval($_POST['id']);
if(!empty($_POST['email']) && !Check::email(trim($_POST['email']))) $this->error('邮箱格式错误~');
$data['nickname']=in(trim($_POST['nickname']));
$acc=model('members')->find("id!='{$id}' AND nickname='".$data['nickname']."'");
if(!empty($acc['nickname'])) $this->error('该昵称已经有人使用~');
if (empty($_FILES['headpic']['name']) === false){
$tfile=date("Ymd");
$imgupload= $this->upload($this->uploadpath.$tfile.'/',config('imgupSize'),'jpg,bmp,gif,png');
$imgupload->saveRule='thumb_'.time();
$imgupload->upload();
$fileinfo=$imgupload->getUploadFileInfo();
$errorinfo=$imgupload->getErrorMsg();
if(!empty($errorinfo)) $this->alert($errorinfo);
else{
if(!empty($_POST['oldheadpic'])){
$picpath=$this->uploadpath.$_POST['oldheadpic'];
if(file_exists($picpath)) @unlink($picpath);
}
$data['headpic']=$tfile.'/'.$fileinfo[0]['savename'];
}
}
$data['email']=in($_POST['email']);
$data['tel']=in($_POST['tel']);
$data['qq']=in($_POST['qq']);
model('members')->update("id='{$id}'",$data);
$info=model('members')->find("id='{$id}'");
if($info['headpic'] && !Check::url($info['headpic'])) $info['headpic']=__UPLOAD__.'/member/image/'.$info['headpic'];
$cookie_auth = $info['id'].'\t'.$info['groupid'].'\t'.$info['account'].'\t'.$info['nickname'].'\t'.$info['lastip'].'\t'.$info['headpic'];
set_cookie('auth',$cookie_auth,0);
$this->success('信息编辑成功~');
}
使用POST方法传输数据就可以绕过,因为作为update条件使用的是POST的id。
URL:http://localhost/yxcms/index.php?r=member/infor/index
POST数据:
id=2&email=google@google.com&nickname=google&tel=1234567890&qq=0987654321
就能修改id=2的用户的信息
建立用户listen2

5.png


登陆listen用户对listen2用户进行发包修改

6.png


登陆用户listen2看一下

7.png


修改成功。
2. Protected/apps/member/controller/inforController.php的cutcover函数
$picname=in($_POST['name']);
$thumb_image_location=$large_image_location=ROOT_PATH.'upload/member/image/'.$picname;
$thumb_width=intval($_POST["thumb_w"]);//剪切后图片宽度
$x1 = intval($_POST["x1"]);
$y1 = intval($_POST["y1"]);
$w =intval($_POST["w"]);
$h = intval($_POST["h"]);
if(empty($thumb_width)||empty($w)||empty($h)) exit(0);
$scale = $thumb_width/$w;
$cropped = resizeThumbnailImage($thumb_image_location,$large_image_location,$w,$h,$x1,$y1,$scale);
if(empty($cropped)) echo 0;
else echo $picname;
没有做任何权限验证,导致可以任意修改别人头像大小(头像地址可以在头像上属性看到)
3. Protected/apps/member/controller/newsController.php的colchange函数
public function colchange()
{
if('change'!=$_POST['dotype']) $this->error('操作类型错误~',url('news/index'));
if(empty($_POST['delid'])||empty($_POST['col'])) $this->error('您没有选择~',url('news/index'));
foreach($_POST['delid'] as $value){
$changeid .= intval($value).',';
}
$changeid = substr($changeid,0,-1);
$data['sort']=$_POST['col'];
model('news')->update('id in ('.$changeid.')',$data);
$this->success('栏目移动成功~',url('news/index'));
}
没有验证news表的account字段导致,可以任意移动别人的新闻到不同的分类。
4. Protected/apps/member/controller/photoController.php的orderchange函数
public function orderchange()
{
$id=intval($_POST['id']);
$data['norder']=intval($_POST['order']);
model('photo')->update("id='{$id}'",$data);
echo 1;
}
任意设置别人的图集顺序。
5. Protected/apps/member/controller/photoController.php的delpic函数
if(empty($_POST['picname'])) $this->error('参数错误~');
$picname=trim($_POST['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;
删除文件的时候没有认证,可以删除任何人图集中的图片(图片地址可以在图片属性上看到)。
6. Protected/apps/member/controller/photoController.php的colchange函数
if('change'!=$_POST['dotype']) $this->error('操作类型错误~',url('photo/index'));
if(empty($_POST['delid'])||empty($_POST['col'])) $this->error('您没有选择~',url('photo/index'));
foreach($_POST['delid'] as $value){
$changeid .= intval($value).',';
}
$changeid = substr($changeid,0,-1);
$data['sort']=$_POST['col'];
model('photo')->update('id in ('.$changeid.')',$data);
$this->success('栏目移动成功~',url('photo/index'));
可以移动任何人的图集栏目。

漏洞证明:

见详细说明

修复方案:

修改逻辑增加验证

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-09-23 14:14

厂商回复:

谢谢您对yxcms的指正

最新状态:

暂无


漏洞评价:

评论