免责申明
本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
0x00 前言
还是熟悉的开头啊,兄弟们,今天来一个OFCMS代码审计记录一下
0x01 信息搜集
首先还是查看pom.xml文件,查看这套源码使用了哪些组件等信息,做一下简单的信息搜集。
简单查看过后发现该项目使用了
freemarker - > 模板注入
Log4j -> 之前爆的nday
JDBC -> 链接数据库
fastjson -> 之前爆的nday
......
拿到这些信息之后我们先记到小本本上,方便我们后去测试组件漏洞
0x02 审计流程
SQL注入漏洞
前面我们得知此项目使用的是JDBC进行操作数据库语句,那么在JDBC当中存在两个执行sql语句的方式
直接执行方式
executeQuery()方式
预编译方式
prepareStatement()方式
我们先去查看后台对应的功能点
在代码生成这块存在一个新增语句,后们尝试行下
发现最终调用的是creater方法
对应文件在com/ofsoft/cms/admin/controller/system/SystemGenerateController.java
首先跟进getPara方法
通过request.getparameter方法封装到getpara方法当中用来获取用户的传参,然后传入到了Db.update方法当中,继续跟进update方法查看
这里发现直接对sql传入的参数放入了 prepareStatement()当中,虽然这个是预编译的手段,但是我们可以控制整个语句,直接可以进行执行sql语句,并不是传统的那种sql语句当中的一部分可控,而是全部可控所以,这里存在一个sql注入漏洞
漏洞验证
成功的得到了回显
任意文件读取
在文件
com/ofsoft/cms/admin/controller/cms/TemplateController.java
这里接收传参的三个值分别为dir up_dir res_path参数,然后进行了简单的判断再44 477行代码进行了敏感操作,路径的拼接,没有经过任何的过滤那么我们现在知道了dir是可以进行跳目录的
继续向下走查看代码
然后进行获取file_name参数然后传递给fileName变量最后判断filename是否不为空,再判断files是否为空,如果不是空那么进行遍历files内的全部文件然后和file_name进行比较有则返回无则返回files的第一个文,最终进行读取出来文件
最后我们知道了
dir是控制程序当前目录的
file_name是我们要读取的文件,如果没有那么会返回第一个文件
漏洞验证
任意文件写入
在同文件下还有一个save方法
先是去获取参数res_path然后进行了一个路径的获取再去接收dirs参数最后去判断一下dirName是否为空,如果不为空那么创建一个新的目录如果是空接收参数file_name参数并且再去接收一个file_content参数,进行了一个过滤之后创建新的一个目录,并且调用了方法FileUtils.writeString,对该方法进行跟进
这里进行实例化了OutputSeream类然后使用write进行了写入,并且将String转换为了数组形式
这里我们知道了res_path为写入路径
file_name为写入文件名称
file_content为写入的内容
漏洞验证
成功的写入
这里的路径是通过断点调试之后找到的路径
0x03 审计结束!
至此完结
原文始发于微信公众号(进击安全):OFCMS代码审计-JAVA
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论