Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

news2025/1/8 17:00:28

文章目录

  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
  • 1. 前言
  • 2. 项目环境搭建
  • 3. 项目路由机制
        • 3.1. 1)先搜索pom.xml文件,看看使用了什么框架
        • 3.2. 2)确定是否是spring的路由机制
        • 3.3. 3)确定自写路由机制的特点
        • 3.4. 4)从前端探索
        • 3.5. 5)断点调试
        • 3.6. 6)寻找路径后的`.json`
        • 3.7. 7)测试下结论

Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

1. 前言

我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。

我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该是从0开始找到漏洞所在,包括思路!

所以这里不管有没有漏洞,我都会把审计过程写出来,因此篇幅会很长,但我认为这样对你会很有帮助。

知其然亦知所以然。

由于篇幅较长,因此我会分几篇进行,本篇是整个系列的第1篇,讲解两个内容:

  • 项目环境搭建
  • 项目路由机制

本系列其他文章

  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计

文章中有错误点,或者思路上有什么问题的,欢迎师傅们留言指出~

2. 项目环境搭建

项目地址:https://gitee.com/oufu/ofcms

版本:v1.1.2

下载地址:https://gitee.com/oufu/ofcms/archive/refs/tags/V1.1.2.zip

1)下载项目源码,解压,使用idea打开;修改数据库连接信息。

  • 配置文件位置:ofcms-V1.1.2/ofcms-admin/src/main/resources/dev/conf/db.properties

2)新建数据库,默认数据库名ofcms,并导入sql文件

  • 项目sql文件位置:ofcms-V1.1.2/ofcms-admin/src/main/resources/conf/sql/install.sql
  • 打开install.sql文件,全选语句,点击左上角执行,完毕之后,查看数据库表是否完整

3)加载项目依赖后,配置tomcat:

注意项目名称,否则无法访问

4)启动tomcat项目,默认弹出首页,环境搭建成功。

3. 项目路由机制

在真正审计之前,最好是先确定下项目的路由机制,有了路由我们才能更好的了解前端功能是如何与后端功能函数搭配的,也是我们验证漏洞的必要条件。

如何项目使用了某些框架,那么项目路由机制和框架路由机制大概率是相同的;但是有些可能不同,比如本项目就是一个和使用框架不太相同的路由机制。(在这里费了好长时间~)

在这里,我们先分析下本项目的路由机制。

3.1. 1)先搜索pom.xml文件,看看使用了什么框架

我们可以看到,该项目使用了 springframework,那该项目大概率使用的就是spring的路由机制。

3.2. 2)确定是否是spring的路由机制

搜索@Mapping@Request等spring的路由机制的常用注解,发现没有!

那大概率,这里就是自己写的路由机制了。

3.3. 3)确定自写路由机制的特点

这里根据不同的项目会有不同的方式,而该项目在前面已经知道使用了springframework,那么应该会有Controller,寻找一下Controller,因为在springframework中一般路由映射是写在Controller上面的。

通过搜索几个Controller之后,发现:该项目的路由看似像通过@Action注解完成的,但是类中的功能函数并没有什么注解。这里会有一个疑问?通过注解中的路径可以定位到类,但怎么定位到功能函数呢?

这里卡了很久。不行就换个思路,从前端尝试探索。

  • 这里多说一下:@Action一般是Struts2中的路由注解,所以这里我还怀疑了该项目使用了Struts2框架,但是搜索struts2.xml没有搜到!
3.4. 4)从前端探索

登录后台,之后随便找个功能,点击一下,并抓包

路径是这样的~

接下来怎么办?我的方法是在后端搜索该路径,当然不要搜全路径(搜索的时候可以不断的缩小路径)

一路搜索下来之后,到达了@Action注解,点进去看一下。

刚才请求的路径是这样的:/ofcms_admin_war/admin/comn/service/del.json?sqlid=system.log.delete,当前定位的类在admin目录下,所以前面这段admin/comn/service路径对上了,但是后面的del.json是什么?

我们可以发现,该ComnController类中存在del()方法,难到del.json对应就是这个方法吗?

我们可以打断点调试看一下:

3.5. 5)断点调试

在del()方法处打个断点,然后启动调试,重新点击该功能。

发现,确实停留到此处。

也就是说/ofcms_admin_war/admin/comn/service/del.json对应的就是admin目录下的存在@Action(path="/comn/service")注解的类中的del()方法。其实到这里已经够用了。

但是这里稍微深入一下,为什么路径是del.json

3.6. 6)寻找路径后的.json

这里该如何找呢?我们可以在项目源码中搜索.json,而且找的应该是字符串~因为这里只是路径中的字符串,不是方法什么的…

大概看一下,发现存在一个这样的语句,看红框位置,点进去看一下

这个类名字叫ActionHandler,名字看起来就和@Action注解有关。

再看下注释:“请求后缀名处理”。看来我们寻找的没错了。

大概分析下代码:

public class ActionHandler extends Handler {
  private String[] suffix = { ".html", ".jsp", ".json" };
    public static final String exclusions = "static/";

  public ActionHandler(String[] suffix) {
    super();
    this.suffix = suffix;
  }

  public ActionHandler() {
    super();
  }

  @Override
  public void handle(String target, HttpServletRequest request,
      HttpServletResponse response, boolean[] isHandled) {
    /**
     * 不包括 suffix 、以及api 地址的直接返回
     */
    //过虑静态文件
    if(target.contains(exclusions)){
      return;
    }
    target = isDisableAccess(target);
    BaseController.setRequestParams();
    next.handle(target, request, response, isHandled);
  }

  private String isDisableAccess(String target) {
    for (int i = 0; i < suffix.length; i++) {
      String suffi =  getSuffix(target);
      if (suffi.contains(suffix[i])) {
        return target.replace(suffi, "");
      }
    }
    return target;
  }
  
  public static String getSuffix(String fileName) {
    if (fileName != null && fileName.contains(".")) {
      return fileName.substring(fileName.lastIndexOf("."));
    }
    return "";
  }
}

可以看到,请求的地址中后缀内容需要包含".html", “.jsp”, “.json”。对,是包含,不是等于。

也就是说我们请求的地址可以是以上三种,也可以是".jsonaaa",当然这里也没什么意义,只是分析下~

3.7. 7)测试下结论

将路径修改为del.jsonaaa,发现可以正常进入del()方法,即我们的结论是正确的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双指针(7)_单调性_三数之和

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 双指针(7)_单调性_三数之和 收录于专栏【经典算法练习】 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目…

【Redis】redis5种数据类型(string)

目录 redis5种数据类型和内部编码方式 redis单线程模型 string字符串类型相关命令 SET GET MSET MGET SETNX SETEX ​编辑PSETEX value值为整数&#xff0c;进行加减操作 INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN string的…

VMwareWorkstation安装UOS系统(1070版本)教程

UOS系统是一款国产信创操作系统。目前市面上主流的系统版本是1070&#xff0c;下面我们用虚拟机来安装一下这款系统。 创建虚拟机 首先&#xff0c;我们先打开VMwareWorkstation软件&#xff0c;新建虚拟机 选择自定义&#xff0c;点击下一步 点击下一步 选择稍后安装操作系统…

【通信管理之c++基础01】std::future

std::future https://en.cppreference.com/w/cpp/thread/future https://cplusplus.com/reference/future/future/ std::async #

实验一 局域网设计

一、实验目的 1.掌握网络工程中需求分析方法。 2.子网IP地址规划及子网间互相通信的方法。 3.掌握局域网的构建方法。 二、实验描述 某中学拟建设一个校园网&#xff0c;网络使用192.168.10.0/24这个地址段。计算机主要分布如下&#xff1a;两个学生机房各为10台&#xff…

数据库课程 CMU15-445 2023 Fall Project-0 项目记录

0. 实验结果 1. 环境配置 1.1 虚拟机Ubuntu 22.04.4 LTS 1.2 Vscode 插件安装clangd&#xff1a;代码补全 1.3 参考官方Project 0完成环境配置 1.4 获取到的代码&#xff0c;切换分支到2023 Fall git checkout fc57dab // 仓库中2023 Fall release版本的哈希值 git branch d…

WPF 保姆级教程怎么实现一个树形菜单

先看一下效果吧: 我们直接通过改造一下原版的TreeView来实现上面这个效果 我们先创建一个普通的TreeView 代码很简单: <TreeView><TreeViewItem Header"人事部"/><TreeViewItem Header"技术部"><TreeViewItem Header"技术部-1&q…

低代码平台:助力企业数字化转型的利器

正文&#xff1a; 在数字化时代的浪潮中&#xff0c;企业需要快速适应市场变化和技术进步。传统的软件开发方法往往由于开发周期长、成本高和对技术人员的依赖程度高&#xff0c;难以满足企业的快速响应需求。此时&#xff0c;低代码平台&#xff08;Low-Code Platform&#x…

干货分享|分享一款微软出品的工作效率神器 PowerToys

工具介绍&#xff1a;Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装步骤&#xff1a;直接打开微软商店安装即可&#xff0c;并且可以保证下载到最新版本。 功能介绍&#xff1a; 高级粘贴 高级…

js react 笔记 2

起因&#xff0c; 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块 const { randomUUID } require(crypto);const uuid randomUUID(); console.log(uuid); // 输出类似 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d 2. 使用 props, 传递参数…

[uniapp/wx小程序] 关于cover-view滚动/点击穿透问题的解决方案/cover-view 的坑

情况&#xff1a;如果在原生组件上&#xff0c;搞了一些弹窗、覆盖层、操作栏等等的东西&#xff0c;有层级的情况&#xff0c;就会出现事件穿透的问题 问题&#xff1a;自然会想到官方给出的解决方案&#xff1a;使用cover-view。但有时穿透问题虽然解决了&#xff0c;但会出…

【NanoEdgeAIStudio】初次体验

本文前言 NanoEdge ai Studio是ST提供的免费软件&#xff0c;可以轻松地将ai添加到任何Arm Cortex-M MCU上运行的任何嵌入式项目中。官网首页&#xff1a;NanoEdge AI Studio&#xff0c;官方文档&#xff1a;AI:NanoEdge AI Studio。官方文档写的很详细&#xff0c;建议观看。…

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【数据结构】顺序表和链表——链表(包含大量经典链表算法题)

文章目录 1. 单链表1.1 概念与结构1.1.1 结点1.1.2 链表的性质1.1.3 链表的打印 1.2 实现单链表1.3 链表的分类1.4 单链表算法题1.4.1 移除链表元素1.4.2 反转链表1.4.3 链表的中间结点1.4.4 合并两个有序链表1.4.5 链表分割1.4.6 链表的回文结构1.4.7 相交链表1.4.8 环形链表1…

【运维监控】influxdb 2.0+grafana 监控java 虚拟机以及方法耗时情况(完整版)

关于java应用的监控本系列有文章如下&#xff1a; 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

软考科目傻傻分不清?一次搞懂各科目考核内容!小白不再纠结!

2024年下半年软考报名已经逐步进入尾声了&#xff0c;大部分考生都已完成报名&#xff0c;但有不少小白因为是第一次报考&#xff0c;对各科目傻傻分不清&#xff0c;导致报错了科目…… 这种情况很可能会影响考试&#xff0c;浪费了一次报考机会。而为了尽量避免这一情况再发生…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

国产“小钢炮”MiniCPM3-4B:小参数,大能量!

前沿科技速递&#x1f680; 在 AI 大模型浪潮中&#xff0c;国内厂商面壁智能再次突破&#xff0c;推出了其最新的“小钢炮”系列——MiniCPM 3.0。这款全新模型不仅实现了在移动设备上运行 GPT-3.5 级别的能力&#xff0c;而且具备超强的推理、检索与代码解释功能。MiniCPM 3.…

Python必知必会:程序员必须知道的22个Python单行代码!

今天给大家分享24个每个Python程序员都必须知道的单行代码&#xff0c;帮你写出更简洁、更优雅、更高效的代码。 1. 列表推导式 列表推导式&#xff08;List Comprehensions&#xff09;可以提供一种简洁的方式创建列表。相较于传统的循环&#xff0c;列表推导式更高效、可读…

240909-ChuanhuChatGPT集成Ollama的环境配置

A. 最终效果 B. 需求文件 requirements.txt (至少需要安装这个&#xff0c;具体参见官网)requirements_advanced.txt &#xff08;如果安装了Ollama&#xff0c;并且可以进行对话&#xff0c;可以不需要安装&#xff0c;具体参见官网&#xff09;requirements_succcess.txt&am…