记一次不知名小CMS代审过程-MRCMS

admin 2024年9月13日03:06:44评论19 views字数 3525阅读11分45秒阅读模式
记一次不知名小CMS代审过程-MRCMS
记一次不知名小CMS代审过程-MRCMS

点击上方蓝字·关注我们

前言
记一次不知名小CMS代审过程-MRCMS

本篇文章首发在先知社区,作者C@ig0 (本人)  先知社区名称:caigo转载原文链接为:https://xz.aliyun.com/t/15498这套系统是我无意中发现的,个人作者写的,比较老,由于知名度不高,网上一篇文章我都没找到,我这篇应该是全网首发,该系统的部分漏洞还是比较经典和有趣的

目录
记一次不知名小CMS代审过程-MRCMS
项目介绍环境搭建漏洞挖掘    多处SQL注入    Freemake模板注入    XSS(存储型)    任意文件写入    文件上传    任意文件删除最后

项目介绍

MRCMS 是一款Java开发的内容管理系统,采用数据模型+模板+插件实现,内置提供了文章模型发布功能,是一款开源免费的内容管理系统。系统采用Spring为核心,支持页面静态化、页面国际化、文件上传、富文本编辑、Markdown、SEO优化、站内统计、主题、前后端分离、插件等功能

环境搭建

项目地址:https://github.com/wuweiit/mushroom/releases/tag/v3.1.2

注意这里下载Source code

记一次不知名小CMS代审过程-MRCMS

下载好后,使用IDEA打开项目,等待maven加载。

加成完成后,修改数据库配置文件,创建对应数据库

配置文件:mushroom_3.1.2srcmainresourcesconfig.properties

记一次不知名小CMS代审过程-MRCMS

创建对应数据库后导入sql文件

sql文件:mushroom_3.1.2databasev-3.13.1.0db_mrcmsv3.sql

记一次不知名小CMS代审过程-MRCMS

配置完成后可以直接使用IDEA启动

.md文件中演示了命令

记一次不知名小CMS代审过程-MRCMS

使用tomcat启动的话,运行完.md的命令后,打包

运行maven命令

mvn  package -DskipTests=true

记一次不知名小CMS代审过程-MRCMS

打包完成后,放到tomcat/webapps目录下,启动tomcat

启动完成后,访问 http://127.0.0.1:8080/mrcms/admin/login.do

记一次不知名小CMS代审过程-MRCMS

管理员账号密码:admin/1

记一次不知名小CMS代审过程-MRCMS

漏洞挖掘

多处SQL注入

翻看pom.xml文件,未发现第三方数据库依赖,初步判断使用了原生的JDBC

全局搜索对应关键词 + 和 append(

我这里都搜过了,就直接演示了,全局搜索append(

记一次不知名小CMS代审过程-MRCMS

可以看到有几个参数,这里我也都看了,只有一个参数是可控的

定位到这个类里面

mushroom_3.1.2srcmainjavaorgmarkermushroomdaoDaoEngine.java

记一次不知名小CMS代审过程-MRCMS

这个方法需传入ids参数,并且ids参数是直接拼接到sql语句中的,查看它的使用

记一次不知名小CMS代审过程-MRCMS

可以看到有很多处都使用了,这里随便点一个跟到功能层 (真随便点的)

mushroom_3.1.2srcmainjavaorgmarkermushroomcontrollerChipController.java

@ResponseBody
@RequestMapping("/delete")
public Object delete(@RequestParam("rid") String rid){
boolean status = commonDao.deleteByIds(Chip.class, rid);
if(status){
chipData.syn();//同步碎片集合内容
return new ResultMessage(true,"删除成功!");
}else{
return new ResultMessage(false,"删除失败!");
}
}

对应的参数的rid,是通过@RequestParam注解接收的,这里可以构造对应路由访问/admin/chip/delete

也可以从功能点抓包,从注释中知道是碎片管理的功能点,在后台寻找对应功能

记一次不知名小CMS代审过程-MRCMS

burp抓包

记一次不知名小CMS代审过程-MRCMS

参数路由都能对应上,直接sqlmap搜哈

记一次不知名小CMS代审过程-MRCMS

漏洞存在,只要使用deleteByIds这个方法的功能点,第二个参数我们可控就存在注入,由于漏洞代码一样只是功能点不同,这里就演示一个,各位感兴趣自己下去试。

Freemake模板注入

从功能点看的,翻看网站功能点的时候,发现模板字眼

寻找修改模板的地方,发现网站存在文件管理功能,可以修改模板文件

记一次不知名小CMS代审过程-MRCMS

到源码中查看使用的模板解析技术,发现是freemarker,这个项目介绍里面也有说

记一次不知名小CMS代审过程-MRCMS

那么知道可以修改模板文件了,就寻找里可以触发

发现在栏目管理处编辑栏目可以选择模板

记一次不知名小CMS代审过程-MRCMS

修改点和触发点都找到了,直接演示了

记一次不知名小CMS代审过程-MRCMS

记一次不知名小CMS代审过程-MRCMS

访问对应栏目,计算机弹出

记一次不知名小CMS代审过程-MRCMS

根据选择渲染文件的功能处抓包查看对应路由

记一次不知名小CMS代审过程-MRCMS

定位到对应代码段

记一次不知名小CMS代审过程-MRCMS

但是这个方法里面没有看到渲染文件的方法,到这里我陷入了迷茫,如果不是在这里解析的,那就只能是在访问对应的文件时候解析,于是乎我去抓访问栏目的数据包

记一次不知名小CMS代审过程-MRCMS

但是这个数据包很简单,只是请求了我们定义的地址,这个源码中肯定是搜不到的,于是乎我开始了思考。。。

好吧其实在这里我的思路就断了,于是我去搜索渲染模板的执行方法.process(),一步步跟,分析了多处代码段,最终构造了一整套的解析流程,这个过程挺烦的,我也不能确定是不是这样。。。

首先解析模板文件的入口是

mushroom_3.1.2srcmainjavaorgmarkermushroomservletDispatcherServlet.java中

servlet层(其实有这样想过),有两个方法,doget和dopost,由于我们是get请求所以看doget,他会执行.progress方法法

记一次不知名小CMS代审过程-MRCMS

跟进这个方

记一次不知名小CMS代审过程-MRCMS

他这里使用ActionContext对象去获取我们请求包,也包含/xxxx.html在内,然后实例化了一个WebAPP,跟进.start()

记一次不知名小CMS代审过程-MRCMS

这里会使用.get获取请求包中的解析地址,然后进入if判断,通过注释也可以看出,外层if判断但是请求资源,我们请求的是页面,所以会进入if,内if判断的是是否contenId,字面是理解应该是参数类似,我们没有所以这里不满足,会执行.getByUrl()方法跟进这个方法

记一次不知名小CMS代审过程-MRCMS

执行sql方法?继续跟进

记一次不知名小CMS代审过程-MRCMS

来到了Dao层,向下看语句

记一次不知名小CMS代审过程-MRCMS

这个时候你可能会问跟这个方法干什么,确实这个貌似没有必要,只是验证它的执行流程,如果按照我们的逻辑,它访问/xxxx.html的时候会执行sql语句,也就是上面这段,起一个数据库监听,尝试访问页面

记一次不知名小CMS代审过程-MRCMS

可以看到确实有执行记录,那么这里我们分析的没错,而且这里我们知道了pageName就是我们访问的文件名,底层sql执行的时候使用了预编译,如果没有又是一处注入,回到前面的代码

记一次不知名小CMS代审过程-MRCMS

代码会继续向下执行,可以看到有一个dataToView.process(param.template);,我们跟进这个方法

记一次不知名小CMS代审过程-MRCMS

最后执行template.process(),执行代码

XSS(存储型)

网站后端有评论处理功能,发现貌似前端有评论功能,但是我没发现,研究下发现要配置插件,但是插件没下载地址,作者手册里没写,所以没法测试,演示的是另一处后端的

还是一样优先选择管理员能交互到的功能测试插XSS

记一次不知名小CMS代审过程-MRCMS

一处文章管理的功能点,可以发布文章,文章标题有字体颜色,感觉有可能,尝试插入测试poc

记一次不知名小CMS代审过程-MRCMS

发现访问文件才会解析xss

记一次不知名小CMS代审过程-MRCMS

由于只有标题能解析js,还需要访问对应文件,其实比较鸡肋,而且有点明显。。。

记一次不知名小CMS代审过程-MRCMS

任意文件写入

就是修改模板文件的那一处功能点,抓包看对应路由

记一次不知名小CMS代审过程-MRCMS

定位代码段

记一次不知名小CMS代审过程-MRCMS

这里逻辑很简单,.getSuffix获取文件后缀,然后判断是否为jsp,判断后不为向下走执行FileTools.setFileContet,跟进方法

记一次不知名小CMS代审过程-MRCMS

继续跟

记一次不知名小CMS代审过程-MRCMS

最后使用PrintWriter(filePath, character)写文件

可以看出这里只对文件后缀进行了检测,而且条件只是不为jsp,没对路径进行检测,可以目录穿越,jsp检测可以用jspx,jspf或者截断符绕过

抓包修改文件

我这里上传jspf后缀的🐎(这个后缀我倒是第一次知道查资料的时候发现的,我本地的tomcat默认就可以解析,所以还是可以记一下的)

记一次不知名小CMS代审过程-MRCMS

访问文件

记一次不知名小CMS代审过程-MRCMS

文件存在,哥斯拉连接

记一次不知名小CMS代审过程-MRCMS

文件上传

和文件修改功能点是同一处

记一次不知名小CMS代审过程-MRCMS

burp抓包

记一次不知名小CMS代审过程-MRCMS

定位对应路由

记一次不知名小CMS代审过程-MRCMS

这个和文件写入一样,只检测了文件后缀,绕过思路也一样,最后使用FileOutputStream()上传文件,这个就不复现了。

任意文件删除

还是在文件管理处

记一次不知名小CMS代审过程-MRCMS

burp抓包

记一次不知名小CMS代审过程-MRCMS

定位到对应代码段

记一次不知名小CMS代审过程-MRCMS

没有对path做校验可以跨目录删除文件

tomcat目录下创建个文件

记一次不知名小CMS代审过程-MRCMS

构造请求包删除

记一次不知名小CMS代审过程-MRCMS

记一次不知名小CMS代审过程-MRCMS

成功删除

最后

这套源码结构简单,漏洞代码也挺经典的,适合新手练手,还有一个比较有意思的是,除了我文章中提到的几个这套系统应该还有别的漏洞,我没有继续测,由于这套CMS网上没有对应的审计文章,也没法比对自己遗漏了哪些,各位感兴趣的可以自行测试。

原文始发于微信公众号(菜狗安全):记一次不知名小CMS代审过程-MRCMS

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月13日03:06:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次不知名小CMS代审过程-MRCMShttps://cn-sec.com/archives/3158822.html

发表评论

匿名网友 填写信息