概述
悟空軟件長期為企業提供企業管理軟件(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文章
789瀏覽量
46700 -
CRM
+關注
關注
1文章
152瀏覽量
22137 -
數據庫
+關注
關注
7文章
4020瀏覽量
68349 -
HRM
+關注
關注
0文章
10瀏覽量
9368
原文標題:悟空crm漏洞新用
文章出處:【微信號:Tide安全團隊,微信公眾號:Tide安全團隊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
curl中的TFTP實現:整數下溢導致堆內存越界讀取漏洞
海康威視通過漏洞管理體系認證
什么是零日漏洞?攻防賽跑中的“時間戰”
UPS不間斷電源:守護企業核心業務(ERP/CRM)不中斷的終極指南
探索BOURNS CRM - Q汽車級高功率貼片電阻:特性與應用全解析
分析嵌入式軟件代碼的漏洞-代碼注入
兆芯加入基礎軟硬件產品漏洞生態聯盟
行業觀察 | 微軟發布高危漏洞更新,涉及 Windows、Office、SQL Server 等多款產品
行業觀察 | Azure、RDP、NTLM 均現高危漏洞,微軟發布2025年8月安全更新
科技云報到:熱鏈路革命:阿卡 CRM 的 GTM 定位突圍
新一代神經擬態類腦計算機“悟空”發布,神經元數量超20億
有屏幕就能玩《黑神話:悟空》:“無影”的黑科技
悟空crm漏洞新用概述
評論