### 简要描述: 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看看是什么 [<img src="https://images.seebug.org/upload/201409/22084923e748eeb1fdcd89a0b19b8c1ab1f1229d.png" alt="1.png" width="600"...
### 简要描述: 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看看是什么 [<img src="https://images.seebug.org/upload/201409/22084923e748eeb1fdcd89a0b19b8c1ab1f1229d.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/22084923e748eeb1fdcd89a0b19b8c1ab1f1229d.png) 是NoPic.gif。接下来,看一下数据库news这个表里面的picture字段(默认安装的数据)这个的意思就是新闻里面有没有图片封面,这个实际使用中是肯定有的,真实利用的时候我甚至可以用爆破的方法~~我以测试数据为例: [<img src="https://images.seebug.org/upload/201409/22084948fac7b3bf57368aeac5f241c11c7d58c6.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/22084948fac7b3bf57368aeac5f241c11c7d58c6.png) 可以看到很多picture字段不是NoPifc.gif,这些picture对应的id都是能够导致这个漏洞可以被触发的参数,只需要把url post变量中id这个参数赋值为这些id值就能够成功触发。做一下测试,首先我在网站根目录下放置一个123.txt [<img src="https://images.seebug.org/upload/201409/220850182e025a60f282c9896554720a6c151903.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/220850182e025a60f282c9896554720a6c151903.png) 然后点击执行: [<img src="https://images.seebug.org/upload/201409/220850419a6825e30ecf41659da7e534c79ce7d6.png" alt="4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/220850419a6825e30ecf41659da7e534c79ce7d6.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://images.seebug.org/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 [<img src="https://images.seebug.org/upload/201409/220851148dbd78151e8fc198ce310090478902b1.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/220851148dbd78151e8fc198ce310090478902b1.png) 登陆listen用户对listen2用户进行发包修改 [<img src="https://images.seebug.org/upload/201409/22085134ad77a4f92638aed01a700d840d62d3b6.png" alt="6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/22085134ad77a4f92638aed01a700d840d62d3b6.png) 登陆用户listen2看一下 [<img src="https://images.seebug.org/upload/201409/220851512e4d60876e3d8a1e324b77c07f2484db.png" alt="7.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/220851512e4d60876e3d8a1e324b77c07f2484db.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')); 可以移动任何人的图集栏目。 ### 漏洞证明: 见详细说明