概述
悟空軟件長期為企業提供企業管理軟件(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跑一下這個請求包。
代碼分析:
publicfunctiondateList() { $param=$this->param; $taskModel=model('Task'); $userInfo=$this->userInfo; $param['user_id']=$userInfo['id']; $data=$taskModel->getDateList($param); returnresultArray(['data'=>$data]); }
此方法中的getDateList讀取數據庫,看方法邏輯:
publicfunctiongetDateList($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_idlike"%'.$str.'%")or(main_user_id='.$user_id.'))'; $whereDate='(stop_time>0andstop_timebetween'.$start_time.'and'.$stop_time.')or(update_timebetween'.$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?:[]; }
再此方法中接受的參數有start_time、stop_time、user_id三個參數,其實這三個參數都沒有加過濾,直接字符串拼接。所以都存在SQL注入點,只不過sqlmap在start_time的時候,就跑出結果了,后面不驗證罷了。
需要提醒的是,再最新版本中,這個url需要構造出來,而不是點解控制臺中哪個url。項目方把這個功能模塊去掉了,但是代碼并沒有刪除。簡單驗證如下圖:
所以,前臺的vue打包程序中,沒有這個路由了。只能通過后期的構建,才能復現出這個漏洞。
任意文件上傳
在平臺所有文件上傳點上,選取上傳用戶圖像的功能點。
使用burpsuite抓包,如下:
將用戶名和圖片內容分別替換成php后綴的文件,和PHP代碼如:此時返回的數據是錯誤的,不過沒關系,文件已經生成了。如下圖所示:
嘗試了很多次,生的文件比較多。此時從瀏覽器上訪問任意一個文件路徑,效果如下:
當寫入一句話的時候,也是可以用蟻劍連接的。
代碼分析:通過抓包,訪問的url/index.php/admin/users/updateImg可以看到該方法如下:
publicfunctionupdateImg() { $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){ returnresultArray(['error'=>$fileModel->getError()]); } returnresultArray(['data'=>'上傳成功']); }
在方法里,有個updateByField的方法,這個是上傳文件的調用,方法體如下:
publicfunctionupdateByField($file,$module,$module_id,$field,$thumb_field='',$x='150',$y='150') { if(empty($module)||empty($module_id)||empty($field)){ $this->error='參數錯誤'; returnfalse; } $info=$file->move(FILE_PATH.'public'.DS.'uploads');//驗證規則 $fileInfo=$info->getInfo();//附件數據
在這個方法中,有個文件管理類file,其中的move方法做了文件的上傳操作,如下:
publicfunctionmove($path,$savename=true,$replace=true) { //文件上傳失敗,捕獲錯誤代碼 if(!empty($this->info['error'])){ $this->error($this->info['error']); returnfalse; } //檢測合法性 if(!$this->isValid()){ $this->error='uploadillegalfiles'; returnfalse; } //驗證上傳 if(!$this->check()){ returnfalse; } $path=rtrim($path,DS).DS; //文件保存命名規則 $saveName=$this->buildSaveName($savename); $filename=$path.$saveName; //檢測目錄 if(false===$this->checkPath(dirname($filename))){ returnfalse; } //不覆蓋同名文件 if(!$replace&&is_file($filename)){ $this->error=['hasthesamefilename:{:filename}',['filename'=>$filename]]; returnfalse; } /*移動文件*/ if($this->isTest){ rename($this->filename,$filename); }elseif(!move_uploaded_file($this->filename,$filename)){ $this->error='uploadwriteerror'; returnfalse; } //返回File對象實例 $file=newself($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;
也就是說,前端可以猜到具體的文件夾,但是具體的文件名,需要后期做個碰撞的腳本,才可以獲取到。因為是白盒審計,這一步就暫時省略掉了。
總結
老版本種存在的問題,最新版本也是存在的,只不過需要后期數據的加工,沒有之前版本來的那么容易。所以做程序要用心,做安全更是如此。
審核編輯:劉清
-
SQL
+關注
關注
1文章
760瀏覽量
44076 -
CRM
+關注
關注
1文章
145瀏覽量
21111 -
數據庫
+關注
關注
7文章
3765瀏覽量
64276 -
HRM
+關注
關注
0文章
10瀏覽量
8969
原文標題:悟空crm漏洞新用
文章出處:【微信號:Tide安全團隊,微信公眾號:Tide安全團隊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論