点击上方蓝字·关注我们
本篇文章首发在先知社区,作者C@ig0 (本人) 先知社区名称:caigo转载原文链接为:https://xz.aliyun.com/t/15498,这套系统是我无意中发现的,个人作者写的,比较老,由于知名度不高,网上一篇文章我都没找到,我这篇应该是全网首发,该系统的部分漏洞还是比较经典和有趣的。
项目介绍
环境搭建
漏洞挖掘
多处SQL注入
Freemake模板注入
XSS(存储型)
任意文件写入
文件上传
任意文件删除
最后
项目介绍
MRCMS 是一款Java开发的内容管理系统,采用数据模型+模板+插件实现,内置提供了文章模型发布功能,是一款开源免费的内容管理系统。系统采用Spring为核心,支持页面静态化、页面国际化、文件上传、富文本编辑、Markdown、SEO优化、站内统计、主题、前后端分离、插件等功能
环境搭建
项目地址:https://github.com/wuweiit/mushroom/releases/tag/v3.1.2
注意这里下载Source code
下载好后,使用IDEA打开项目,等待maven加载。
加成完成后,修改数据库配置文件,创建对应数据库
配置文件:mushroom_3.1.2srcmainresourcesconfig.properties
创建对应数据库后导入sql文件
sql文件:mushroom_3.1.2databasev-3.13.1.0db_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.2srcmainjavaorgmarkermushroomdaoDaoEngine.java
这个方法需传入ids参数,并且ids参数是直接拼接到sql语句中的,查看它的使用
可以看到有很多处都使用了,这里随便点一个跟到功能层 (真随便点的)
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
也可以从功能点抓包,从注释中知道是碎片管理的功能点,在后台寻找对应功能
burp抓包
参数路由都能对应上,直接sqlmap搜哈
漏洞存在,只要使用deleteByIds这个方法的功能点,第二个参数我们可控就存在注入,由于漏洞代码一样只是功能点不同,这里就演示一个,各位感兴趣自己下去试。
Freemake模板注入
从功能点看的,翻看网站功能点的时候,发现模板字眼
寻找修改模板的地方,发现网站存在文件管理功能,可以修改模板文件
到源码中查看使用的模板解析技术,发现是freemarker,这个项目介绍里面也有说
那么知道可以修改模板文件了,就寻找哪里可以触发
发现在栏目管理处编辑栏目可以选择模板
修改点和触发点都找到了,直接演示了
访问对应栏目,计算机弹出
根据选择渲染文件的功能处抓包查看对应路由
定位到对应代码段
但是这个方法里面没有看到渲染文件的方法,到这里我陷入了迷茫,如果不是在这里解析的,那就只能是在访问对应的文件时候解析,于是乎我去抓访问栏目的数据包
但是这个数据包很简单,只是请求了我们定义的地址,这个源码中肯定是搜不到的,于是乎我开始了思考。。。
好吧其实在这里我的思路就断了,于是我去搜索渲染模板的执行方法.process()
,一步步跟,分析了多处代码段,最终构造了一整套的解析流程,这个过程挺烦的,我也不能确定是不是这样。。。
首先解析模板文件的入口是
mushroom_3.1.2srcmainjavaorgmarkermushroomservletDispatcherServlet.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网上没有对应的审计文章,也没法比对自己遗漏了哪些,各位感兴趣的可以自行测试。
原文始发于微信公众号(菜狗安全):记一次不知名小CMS代审过程-MRCMS
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论