由于文件get_linkage.php对于用户提交的变量未过滤,导致本地文件包含漏洞的产生。
相关代码如下:
/api/ get_linkage.php
<code>case 'ajax_select':
$parent_id = $_GET['parent_id'] ? intval($_GET['parent_id']) : 0;
$keyid = $_GET['keyid'];
ajax_select($parent_id,$keyid);
函数ajax_select在相同文件中有定义
function ajax_select($parentid,$keyid) {
$datas = getcache($keyid,'linkage');
$infos = $datas['data'];
$json_str = "[";
$json = array();
foreach($infos AS $k=>$v) {
if($v['parentid'] == $parentid) {
$r = array('region_id' => $v['linkageid'],
'region_name' => $v['name']);
$json[] = JSON($r);
}
}
$json_str .= implode(',',$json);
$json_str .= "]";
echo $json_str;
}</code>
变量$keyid未经过滤进入到函数getcache中
Getcache函数在文件/ phpcms/libs/functions/ global.func.php中
<code>function getcache($name, $filepath='', $type='file', $config='') {
pc_base::load_sys_class('cache_factory','',0);
if($config) {
$cacheconfig = pc_base::load_config('cache');
$cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
} else {
$cache = cache_factory::get_instance()->get_cache($type);
}
return $cache->get($name, '', '', $filepath);
}
</code>
$cache->get()在文件/phpcms/libs/classes/cache_file.class.php
<code>public function get($name, $setting = '', $type = 'data', $module = ROUTE_M) {
$this->get_setting($setting);
if(empty($type)) $type = 'data';
if(empty($module)) $module = ROUTE_M;
$filepath = CACHE_PATH.'caches_'.$module.'/caches_'.$type.'/';
$filename = $name.$this->_setting['suf'];
if (!file_exists($filepath.$filename)) {
return false;
} else {
if($this->_setting['type'] == 'array') {
$data = @require($filepath.$filename);</code>
最终$keyid变量变为$filename的一部分,造成本地文件包含漏洞的产生
由于文件get_linkage.php对于用户提交的变量未过滤,导致本地文件包含漏洞的产生。
相关代码如下:
/api/ get_linkage.php
<pre class="prettyprint linenums">case 'ajax_select':
$parent_id = $_GET['parent_id'] ? intval($_GET['parent_id']) : 0;
$keyid = $_GET['keyid'];
ajax_select($parent_id,$keyid);
函数ajax_select在相同文件中有定义
function ajax_select($parentid,$keyid) {
$datas = getcache($keyid,'linkage');
$infos = $datas['data'];
$json_str = "[";
$json = array();
foreach($infos AS $k=>$v) {
if($v['parentid'] == $parentid) {
$r = array('region_id' => $v['linkageid'],
'region_name' => $v['name']);
$json[] = JSON($r);
}
}
$json_str .= implode(',',$json);
$json_str .= "]";
echo $json_str;
}</pre>
变量$keyid未经过滤进入到函数getcache中
Getcache函数在文件/ phpcms/libs/functions/ global.func.php中
<pre class="prettyprint linenums">function getcache($name, $filepath='', $type='file', $config='') {
pc_base::load_sys_class('cache_factory','',0);
if($config) {
$cacheconfig = pc_base::load_config('cache');
$cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
} else {
$cache = cache_factory::get_instance()->get_cache($type);
}
return $cache->get($name, '', '', $filepath);
}
</pre>
$cache->get()在文件/phpcms/libs/classes/cache_file.class.php
<pre class="prettyprint linenums">public function get($name, $setting = '', $type = 'data', $module = ROUTE_M) {
$this->get_setting($setting);
if(empty($type)) $type = 'data';
if(empty($module)) $module = ROUTE_M;
$filepath = CACHE_PATH.'caches_'.$module.'/caches_'.$type.'/';
$filename = $name.$this->_setting['suf'];
if (!file_exists($filepath.$filename)) {
return false;
} else {
if($this->_setting['type'] == 'array') {
$data = @require($filepath.$filename);</pre>
最终$keyid变量变为$filename的一部分,造成本地文件包含漏洞的产生
PHPCMS V9.1.8 (20111014)
sebug 临时解决方案:
对变量$keyid做过滤
厂商补丁:
PHPCMS
-------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.phpcms.cn/
暂无评论