当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-084439

漏洞标题:BiWEB最新门户版多处越权打包

相关厂商:BiWEB

漏洞作者: 路人甲

提交时间:2014-11-25 16:17

修复时间:2015-02-23 16:18

公开时间:2015-02-23 16:18

漏洞类型:非授权访问/权限绕过

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-25: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-02-23: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

BiWEB最新门户版多处越权打包

详细说明:

在wooyun上看到了有人把biweb的shell拿到了: WooYun: BIWEB门户版Getwebshell漏洞 ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。
这里提一个越权删除任意用户发布的供求信息、资讯信息、产品信息、企业信息、会展信息、招聘信息、问题信息、视频信息……
这些地方都存在这个漏洞

/ask/adminu/index.php
/company/adminu/index.php
/exhibition/adminu/index.php
/job/adminu/index.php
/links/adminu/index.php
/news/adminu/index.php
/product/adminu/index.php
/trade/adminu/index.php
/video/adminu/index.php


以/trade/adminu/index.php进行证明,看看/trade/adminu/index.php吧

无关代码 
$arrWhere = array();
$arrLink = array();
if(isset($_GET['action'])){
if($_GET['action']=='search') {
// 构造搜索条件和翻页参数
$arrLink[] = 'action=search';
if (!empty($_GET['title'])) {
$strKeywords = strval(urldecode($_GET['title']));
if($strKeywords[0] == '/'){
//精确查询ID
$strKeywords = substr($strKeywords,1);
if(is_numeric($strKeywords)) $arrWhere[] = "id = '" . $strKeywords . "'";
}else{
$arrWhere[] = "tag LIKE '%" . $_GET['title'] . "%'";
}
$arrLink[] = 'title=' . $_GET['title'];
}
if ($_GET['pass'] == '1' || $_GET['pass'] == '0') {
$arrWhere[] = "pass='".$_GET['pass']."'";
$arrLink[] = 'pass=' . $_GET['pass'];
}
if (!empty($_GET['type_id'])) {
$intTypeID = intval($_GET['type_id']);
$arrWhere[] = "type_id='".$intTypeID."' or type_roue_id like '%:$intTypeID:%'";
$arrLink[] = 'type_id='.$intTypeID;
}
} else {
$objWebInit->doInfoAction($_GET['action'],$_POST['select']);
}
}
无关代码


当$_GET['action']=’del’时,则执行这条语句$objWebInit->doInfoAction($_GET['action'],$_POST['select']),我们再去看看doInfoAction(), 在/web_common5.8/php_common.php中

无关代码
function doInfoAction($strAction=null,$arrData=null,$arrFile=array('photo')){
switch ($strAction){
case 'del':
foreach ($arrData as $key=>$val){
$this->deleteInfo($val,$arrFile);
}
break;
case 'delpic':
foreach ($arrData as $key=>$val){
$this->deleteInfoPic($val,$arrFile);
}
break;
case 'moveup':
foreach ($arrData as $key=>$val){
$this->moveupInfo($val);
}
break;
case 'check':
foreach ($arrData as $key=>$val){
$this->passInfo($val,1);
}
break;
case 'uncheck':
foreach ($arrData as $key=>$val){
$this->passInfo($val,0);
}
break;
case 'settop':
foreach ($arrData as $key=>$val){
$this->topInfo($val,1);
}
break;
case 'unsettop':
foreach ($arrData as $key=>$val){
$this->topInfo($val,0);
}
break;
case 'setrecommend':
foreach ($arrData as $key=>$val){
$this->recommendInfo($val,1);
}
break;
case 'unsetrecommend':
foreach ($arrData as $key=>$val){
$this->recommendInfo($val,0);
}
break;
}
return true;
}
无关代码


再去看看相同文件中的deleteInfo()

function deleteInfo($intInfoID,$arrFile=array('photo')){
if($arr = $this->getInfo($intInfoID)){
if(!empty($this->arrGPic['FileSavePath'])){
foreach($arrFile as $val){
if(!empty($arr[$val]) && is_array($arr[$val])){
foreach($arr[$val] as $v){
if(is_string($v)) {
@unlink($this->arrGPic['FileSavePath'].$v);
@unlink($this->arrGPic['FileSavePath'].'s/'.$v);
@unlink($this->arrGPic['FileSavePath'].'b/'.$v);
@unlink($this->arrGPic['FileSavePath'].'f/'.$v);
}
if(is_array($v)){
@unlink($this->arrGPic['FileSavePath'].$v[$val]);
@unlink($this->arrGPic['FileSavePath'].'s/'.$v[$val]);
@unlink($this->arrGPic['FileSavePath'].'b/'.$v[$val]);
@unlink($this->arrGPic['FileSavePath'].'f/'.$v[$val]);
}
}
}elseif(!empty($arr[$val]) && is_string($arr[$val])){
@unlink($this->arrGPic['FileSavePath'].$arr[$val]);
@unlink($this->arrGPic['FileSavePath'].'s/'.$arr[$val]);
@unlink($this->arrGPic['FileSavePath'].'b/'.$arr[$val]);
@unlink($this->arrGPic['FileSavePath'].'f/'.$arr[$val]);
}
}
}
}else{
check::AlertExit('ID号为 '.$intInfoID.' 的记录并不存在!',-1);
}
$strWhere = " WHERE `id` = $intInfoID";
return $this->deleteDataG($this->tablename2,$strWhere);
}


可以看到,在删除的整个过程中没有对用户的属性进行判断,直接构造了$strWhere = " WHERE `id` = $intInfoID"并执行,这就造成了越权删除。而且无论哪个用户发表的各类信息,其id全都是统一从1开始编号,如果要全部删除,只要遍历就可以了,如果要删除哪条,直接删除其id对应的内容即可。
测试时,注册一个用户,访问 www.xxxx.com/trade/adminu/index.php?action=del,然后修改POST提交的内容为select[]=3,即可供求信息中id为3的供求信息删除。

漏洞证明:

见 详细说明

修复方案:

判断用户属性

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝