目录
漏洞名称:蝉知CMS7.0.1后台模板Getshell
漏洞版本号:V7.0.1
漏洞危害:高危
漏洞描述:
蝉知企业门户系统是由业内资深开发团队开发的一款专向企业营销使用的企业门户系统,企业使用蝉知系统可以非常方便地搭建一个专业的企业营销网站。
后台模板getshell。
漏洞URL:
http://www.czcms.cc/www/admin.php?m=ui&f=edittemplate
漏洞描述:
首先登陆后台->设计->编辑模板
Burp改包
直接getshell
漏洞审计:
漏洞所在文件:\system\module\ui\control.php(在后台模板编辑)
漏洞文件代码:(只贴上相关代码)
首先我们看第788行,$template = $this->config->template->{$this->app->clientDevice}->name;这里代表获取他自己对象中的config属性中的template对象中的{$this->app->clientDevice}对象中的name属性,可以这样理解这里只是获取他的默认模块。我们看看第791行if($_POST)判断$_POST是不是上传,如果是则进入区间。第793行$canManage = array('result' => 'success');创建一个数组,if(!$this->loadModel('guarder')->verify()) $canManage = $this->loadModel('common')->verifyAdmin();这里可以看到if判断是否已经上传过他要求的目录,如果为true那么他就不会去调用验证区间直接跳到第795行。if($canManage['result'] != 'success')如果验证不通过他就会提示需要创建文件,就不会走下下面的区间。我们在看看第796行$result = $this->ui->writeViewFile($template, $this->post->module, $this->post->file);,这里一看就是进入其他区间的,我们追下这个方法在那个地方。
路径:system\module\ui\model.php.php
第1523行public function writeViewFile($template, $module, $file),public代表公共方法,第1525行$file = $this->getExtFile($template, $module, $file);,他这里又调用一次当前文件中的getExtFile方法。
这里可以看到他这里只是简单输出个路径,无视他。回到第二张图片,第1526行$filePath = dirname($file);,这里代表返回路径中的目录部分,第1527行,if(!is_dir($filePath)) mkdir($filePath, 0777, true);判断文件夹是否存在,如果不存在则创建文件夹并赋值777权限。第1528行和第1529行是定义一个数组,第1530行$content = str_replace($gibbedEvils, $evils, $this->post->content);,代表字符串替换,其实他这里写错了不应该这样写的,可以看到他这个$gibbedEvils数组把危险函数用空格来隔开,这样肯定不可以运行的,这个没有问题。那么我们在看看第二个数组$evils,这里的危险函数是可以直接运行的,但是呢,他字符串替换的时候把两个数组搞反了,这样就导致用户端直接上传木马。第1532行if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc()) $content = stripslashes($content);,第一个判断是判断他是否有这个自定义变量,并且get_magic_quotes_gpc()函数是否开启,如果这两个条件满足则使用stripslashes去掉反斜杠函数。第1533行就是写入文件了$result = file_put_contents($file, $content);。让我们在回到第一张图片。第797行if($result) $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('editTemplate', "moduel=$module&file=$file")));,这里判断成功则提示个信息,如果不成功则返回失败信息$this->send(array('result' => 'fail', 'message' => $this->lang->fail));。
漏洞修复:
路径:system\module\ui\model.php.php
在1524行下面添加个basename,返回路径中的文件名,然后在第1530行加2个值,第一个是过滤<?php,为啥说过滤<?php呢?因为如果你要运行php必须加上标准的不然真个php代码是运行不起来的。然后在使用strtolower函数,强制吧英文大写转换成小写在做处理,这样不管你是大小写来写的字我都过滤掉。