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

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

缺陷编号: WooYun-2014-70072

漏洞标题: qibocms多个系统绕过补丁继续注入

相关厂商: 齐博CMS

漏洞作者: ′雨。认证白帽子

提交时间: 2014-07-29 13:56

公开时间: 2014-10-27 13:58

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

2人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-29: 细节已通知厂商并且等待厂商处理中
2014-07-29: 厂商已经确认,细节仅向厂商公开
2014-08-01: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-09-22: 细节向核心白帽子及相关领域专家公开
2014-10-02: 细节向普通白帽子公开
2014-10-12: 细节向实习白帽子公开
2014-10-27: 细节向公众公开

简要描述:

(最后更新于2014-7-28)
附件: 安全补丁.rar (218 K) 下载次数:15582

看到更新补丁了 再来看看。

绕过这补丁 当然 绕过了这补丁的话 也是通杀qibo多个系统。

详细说明:

之前发的 http://**.**.**.**/bugs/wooyun-2010-069746

————————————————————————————————





1.jpg





下载了个补丁下来看看 看了看member目录 竟然没有看到上次我发的那个post.php



我以为没做修复了呢 后来看了看全局文件 inc/common.inc.php中



code 区域
$_POST=Add_S($_POST);
$_GET=Add_S($_GET);
$_COOKIE=Add_S($_COOKIE);





依旧是全局的过滤函数



code 区域
function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
$key=str_replace(array("'",'"','\\','&'),'',$key);
$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;
}





在这里 可以看到修改了这个过滤函数。

添加了一句 $key=str_replace(array("'",'"','\\','&'),'',$key);

把数组中的key 如果含有' 或者 " 或者 \ 清空成空。

那这样数组里面的key就不能像之前一样含有特殊符号了

看起来好像是没有问题了。 但是这里我们来测试一下。



这里我们调用一下qibocms这函数来测试一下



code 区域
<?php
$_GET=Add_S($_GET);
var_dump ($_GET);

function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
$key=str_replace(array("'",'"','\\','&'),'',$key);
$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;
}







2.jpg





这里 我们再在key中加一个单引号 看看会是什么情况。



3.jpg





array(2) { ["a'"]=> string(3) "asd" ["a"]=> string(3) "asd" }



可以看到 其中一个元素有了单引号。 其中一个元素没有单引号。



为什么会有两个元素了。 其实这点我根本没搞懂啊 - -



问了问P神 大概是因为 第一次循环因为单引号被清空了 所以有了一个a元素

然后就创建了一个a元素,导致数组变成了两个元素.

然后这两个元素都在这里面了。。 一个有单引号 一个无单引号。 也就是a'和a两个元素

- - 这里我还是不太懂。

但是就是这样

array(2) { ["a'"]=> string(3) "asd" ["a"]=> string(3) "asd" }

key中还是能引入单引号。

所以导致了这补丁被绕过。

______________________________________________________________________



绕过了这个 又能通杀多个系统了。 这里我就以整站系统做个演示。



继续在member/post.php



code 区域
elseif($job=='manage')
{
if(!$atc_power)showerr("你没权限");
if($rsdb[pages]<2){
header("location:post.php?job=edit&aid=$aid&mid=$mid&only=$only");exit;
}

$erp=get_id_table($aid);
if($step==2){
asort($orderDB);
$i=0;

foreach( $orderDB AS $key=>$value){

$i++;

$db->query("UPDATE {$pre}reply$erp SET orderid=$i WHERE aid='$aid' AND rid='$key'");
}
refreshto("$FROMURL","排序成功",1);





注册一个会员 然后发布文章 因为这个

code 区域
if($rsdb[pages]<2){
header("location:post.php?job=edit&aid=$aid&mid=$mid&only=$only");exit;
}

所以需要发两页。



4.jpg





这里我输出一下这变量 可以看到第一个没单引号 第二个有单引号



但是foreach 是循环执行的 所以第二个也能执行到。





漏洞证明:

5.jpg





成功注入。

修复方案:

这里为什么就不参考一下之前我给的修复方法呢?



code 区域
foreach( $orderDB AS $key=>$value){
$key=addslashes($key);
$i++;

$db->query("UPDATE {$pre}reply$erp SET orderid=$i WHERE aid='$aid' AND rid='$key'");
}





我测试了一下 至少在这里是不能注入了的。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-07-29 15:42

厂商回复:

感谢提出来

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-07-29 14:31 | 贫道来自河北 ( 普通白帽子 | Rank:1469 漏洞数:439 | 一个立志要把乌云集市变成零食店的男人)
    1

    不得不说洞主真是cms的杀手

  2. 2014-07-29 16:35 | 命运 ( 路人 | Rank:3 漏洞数:2 | 我是来乌云秀智商下限的~~)
    0

    洞主小心做黑产的药弄你。

  3. 2014-07-29 16:36 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @命运 已经只剩下最后一口气。

  4. 2014-07-29 23:17 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    蛋疼死我了。。 本来能Getshell的。。。。。

  5. 2014-10-27 21:07 | sutdy ( 普通白帽子 | Rank:101 漏洞数:35 | 0.0)
    0

    洞主 你是哪的?

登录后才能发表评论,请先 登录