电子说
概述
悟空软件长期为企业提供企业管理软件(CRM/HRM/OA/ERP等)的研发、实施、营销、咨询、培训、服务于一体的信息化服务。悟空软件以高科技为起点,以技术为核心、以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上千家企业提供服务。
听说很厉害,搜索了下存在的旧版本漏洞,看看是否还存在这样的漏洞,旧漏洞如下:
按照已有的方向先排查一波。
安装
下载完包后,解压放到环境的根目录。
访问url
点击同意,进行下一步安装。
安装完成,使用安装过程功的账号密码,登录到工作台。
sql注入
进入到管理操作区,找到项目管理,在所有请求中有一个myTask请求,
使用burpsuite抓取到改请求,发送到重放模块,接着修改构建传递的参数,第一个将url部分mytask修改成dateList,将body部分的{"search":"","sort_field":2,"completed_task":true,"owner_user_id":[],"time_type":"","label_id":[]}修改改成{"start_time":"123","stop_time":"12"}此时点击一次go,看是否有正确相应。
接着,将请求保存到一个文本中,命名为post.txt。
接着上sqlmap跑一下这个请求包。
代码分析:
public function dateList() { $param = $this->param; $taskModel = model('Task'); $userInfo = $this->userInfo; $param['user_id'] = $userInfo['id']; $data = $taskModel->getDateList($param); return resultArray(['data' => $data]); }
此方法中的getDateList读取数据库,看方法逻辑:
public function getDateList($param) { $start_time = $param['start_time']; $stop_time = $param['stop_time']; $user_id = $param['user_id']; // $date_list = dateList($start_time, $stop_time, 1); $where = []; $where['ishidden'] = 0; $where['is_archive'] = 0; $where['status'] = 1; $where['pid'] = 0; $str = ',' . $user_id . ','; $whereStr = ' ( create_user_id = ' . $user_id . ' or ( owner_user_id like "%' . $str . '%") or ( main_user_id = ' . $user_id . ' ) )'; $whereDate = '( stop_time > 0 and stop_time between ' . $start_time . ' and ' . $stop_time . ' ) or ( update_time between ' . $start_time . ' and ' . $stop_time . ' )'; $list = db('task') ->where($where) ->where($whereStr) ->where($whereDate) ->field('task_id,name,priority,start_time,stop_time,priority,update_time') ->select(); return $list ?: []; }
所以,前台的vue打包程序中,没有这个路由了。只能通过后期的构建,才能复现出这个漏洞。
任意文件上传
在平台所有文件上传点上,选取上传用户图像的功能点。
使用burpsuite抓包,如下:
将用户名和图片内容分别替换成php后缀的文件,和PHP代码如:此时返回的数据是错误的,不过没关系,文件已经生成了。如下图所示:
尝试了很多次,生的文件比较多。此时从浏览器上访问任意一个文件路径,效果如下:
当写入一句话的时候,也是可以用蚁剑连接的。
代码分析:通过抓包,访问的url/index.php/admin/users/updateImg可以看到该方法如下:
public function updateImg() { $fileModel = model('File'); $param = $this->param; $userInfo = $this->userInfo; //处理图片 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST'); header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); $param['file'] = request()->file('file'); $resImg = $fileModel->updateByField($param['file'], 'User', $param['id'], 'img', 'thumb_img', 150, 150); if (!$resImg) { return resultArray(['error' => $fileModel->getError()]); } return resultArray(['data' => '上传成功']); }
在方法里,有个updateByField的方法,这个是上传文件的调用,方法体如下:
public function updateByField($file, $module, $module_id, $field, $thumb_field = '', $x = '150', $y = '150') { if (empty($module) || empty($module_id) || empty($field)) { $this->error = '参数错误'; return false; } $info = $file->move(FILE_PATH . 'public' . DS . 'uploads'); //验证规则 $fileInfo = $info->getInfo(); //附件数据
在这个方法中,有个文件管理类file,其中的move方法做了文件的上传操作,如下:
public function move($path, $savename = true, $replace = true) { // 文件上传失败,捕获错误代码 if (!empty($this->info['error'])) { $this->error($this->info['error']); return false; } // 检测合法性 if (!$this->isValid()) { $this->error = 'upload illegal files'; return false; } // 验证上传 if (!$this->check()) { return false; } $path = rtrim($path, DS) . DS; // 文件保存命名规则 $saveName = $this->buildSaveName($savename); $filename = $path . $saveName; // 检测目录 if (false === $this->checkPath(dirname($filename))) { return false; } // 不覆盖同名文件 if (!$replace && is_file($filename)) { $this->error = ['has the same filename: {:filename}', ['filename' => $filename]]; return false; } /* 移动文件 */ if ($this->isTest) { rename($this->filename, $filename); } elseif (!move_uploaded_file($this->filename, $filename)) { $this->error = 'upload write error'; return false; } // 返回 File 对象实例 $file = new self($filename); $file->setSaveName($saveName)->setUploadInfo($this->info); return $file; }
到此,方法体中的move_uploaded_file算是保存完了构建的PHP文件,需要注意的是,这里的命名规则,代码里用了时间的随机数,
switch ($this->rule) { case 'date': $savename = date('Ymd') . DS . md5(microtime(true)); break;
也就是说,前端可以猜到具体的文件夹,但是具体的文件名,需要后期做个碰撞的脚本,才可以获取到。因为是白盒审计,这一步就暂时省略掉了。
总结
老版本种存在的问题,最新版本也是存在的,只不过需要后期数据的加工,没有之前版本来的那么容易。所以做程序要用心,做安全更是如此。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !