记一次不知名小CMS代审过程
caigo 发表于 江苏 漏洞分析 630浏览 · 2024-09-02 10:50

前言

这套系统是我无意中发现的,个人作者写的,比较老,由于知名度不高,网上一篇文章我都没找到,我这篇应该是全网首发,该系统的部分漏洞还是比较经典和有趣的。

项目介绍

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

环境搭建

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

注意这里下载Source code

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

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

配置文件:\mushroom_3.1.2\src\main\resources\config.properties

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

sql文件:mushroom_3.1.2\database\v-3.1\3.1.0\db_mrcmsv3.sql

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

md文件中演示了命令

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

运行maven命令

mvn  package -DskipTests=true

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

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

管理员账号密码:admin/1

漏洞挖掘

多处SQL注入

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

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

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

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

定位到这个类里面

mushroom_3.1.2\src\main\java\org\marker\mushroom\dao\DaoEngine.java

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

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

mushroom_3.1.2\src\main\java\org\marker\mushroom\controller\ChipController.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

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

burp抓包

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

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

Freemake模板注入

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

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

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

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

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

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

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

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

定位到对应代码段

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

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

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

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

mushroom_3.1.2\src\main\java\org\marker\mushroom\servlet\DispatcherServlet.java中

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

跟进这个方

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

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

执行sql方法?继续跟进

来到了Dao层,向下看语句

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

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

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

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

XSS(存储型)

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

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

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

发现访问文件才会解析xss

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

任意文件写入

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

定位代码段

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

继续跟

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

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

抓包修改文件

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

访问文件

文件存在,哥斯拉连接

文件上传

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

burp抓包

定位对应路由

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

任意文件删除

还是在文件管理处

burp抓包

定位到对应代码段

没有对path做校验可以跨目录删除文件
tomcat目录下创建个文件

构造请求包删除


成功删除

总结

这套源码比较老了,部分功能点开发时没有安全意识,除了我文章中挖到的几处应该还有别
的,由于这套CMS网上没有对应的审计文章,也没法比对自己遗漏了哪些,部分漏洞代码
很简单,适合新手。

0 条评论
某人
表情
可输入 255