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

文章目录

  • 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();}@Overridepublic 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.rhkb.cn/news/420313.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chapter 14 计算机网络基本概述

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、网络的基本概念二、集线器、交换机和路由器三、互连网与互联网四、网络的类型五、互连网的组成1. 边缘部分2. 核心部分 六、网络协议 前言 计算机网络是现代信息社会…

【每日一题】LeetCode 104.二叉树的最大深度(树、深度优先搜索、广度优先搜索、二叉树)

【每日一题】LeetCode 104.二叉树的最大深度&#xff08;树、深度优先搜索、广度优先搜索、二叉树&#xff09; 题目描述 给定一个二叉树 root&#xff0c;我们需要计算并返回该二叉树的最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 思路分…

极米科技:走出舒适圈,推动数据架构现代化升级 | OceanBase 《DB大咖说》

《DB 大咖说》第 13 期&#xff0c;邀请到了极米科技软件与创新产品线高级架构师施刘凡来进行分享。 在小红书平台上&#xff0c;“是否应将家里的电视升级为投影仪&#xff1f;”这一话题激发了上百万篇笔记的分享与推荐&#xff0c;反映出年轻群体对投影仪的偏好。随着手机、…

ESP32 UDP 05

1.在上一文章基础上修改&#xff0c;文章网址 ESP32-Ethernet-04-CSDN博客 2.基本代码 /* Ethernet Basic ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware…

Apple Intelligence深夜炸场!苹果发布4颗自研芯片,iPhone/iWatch/AirPods大升级

今年 6 月&#xff0c;苹果在 WWDC 上正式推出 Apple Intelligence。消息发布次日&#xff0c;苹果股价在盘中突破 200 美元大关&#xff0c;创 2022 年 11 月 10 日以来最大涨幅&#xff0c;截至收盘&#xff0c;苹果总市值升至 3.18 万亿美元&#xff08;约合人民币 23 万亿&…

通信工程学习:什么是IP-CAN(IP连接接入网)

IP-CAN&#xff1a;IP连接接入网 IP-CAN&#xff08;IP连接接入网&#xff09;是一个通过IP实现用户设备&#xff08;UE&#xff09;与IP多媒体子系统&#xff08;IMS&#xff09;实体之间连通的网络实体和接口的集合。以下是对IP-CAN的详细解释&#xff1a; 一、定义与概述 1…

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现…

WinCC 中对 VBS 进行单步执行调试

以前应该写过文章给各位展示如何在WinCC 中通过自身控件对脚本&#xff08;C、VBS&#xff09;进行脚本诊断和排错。但是也有用户反馈说在编写了一些相对复杂的脚本后&#xff0c;WinCC自身控件无法做到单步调试&#xff0c;也会影响脚本的诊断调试效率。如果能够对WinCC 中的脚…

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…

WRF-LES与PALM微尺度气象大涡模拟、PALM静态数据预备、PALM驱动数据预报、PALM模拟

查看原文>>>WRF-LES与PALM微尺度气象大涡模拟及ChatGPT在大气科学领域应用 针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气…

Parsec无法使用、访问、连接、被墙、被封、800报错解决方案 完美平替软件

最近Parsec出现无法使用、报错等问题&#xff0c;话不多说先上解决办法 方案一&#xff1a;在%appdata%/Parsec/config.txt中&#xff0c;添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http app_proxy true app_proxy_port 你的http代理端口 方案二&#xff1a;…

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&…

嘿嘿 解决了Dev C++ 中文乱码(有效版)

这是博主第一篇博客&#xff01;记录一下博主的小小小小解决史&#xff01; 很早就下载用了Dev c &#xff0c;但现在隔了很长时间没去用过了再次打开发现出现中文乱码的现象&#xff01;在网站上翻阅了许久&#xff01;终于解决了问题&#xff01;困扰了许久&#xff01; ——…

Java easypoi导出word表格显示

1.成品 2.依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi…

LabVIEW制系统开发流程介绍

在开发一个LabVIEW电机控制系统时&#xff0c;尤其是涉及多种类型的电机并需实现本地与远程控制时&#xff0c;合理的开发顺序是确保项目高效完成且返工最少的关键。下面介绍如何按照系统需求分阶段开发&#xff0c;从而保障开发的速度与质量&#xff0c;减少返工的风险。 开发…

RAG+Agent在实际业务落地案例分享+项目推荐

RAG+Agent在实际业务落地案例分享+项目推荐 大模型架构的经典分层,即:应用层、工具层、模型层 & AI Infra: 应用层 - 大模型应用:主要以 RAG&AI Agent 初代的模式透出,主要的落地场景包括内部数据分析 - GBI 即生成式 BI、研发辅助提效 - 生成式 Code、面向外部用…

《垃圾回收的算法与实现》-算法-摘抄

本文是书籍《垃圾回收的算法与实现》的摘抄&#xff0c;不涉及算法源码及步骤讲解模块。 预备 对象由头(header)和域(field)构成。 头&#xff1a;对象中保存对象本身信息的部分&#xff0c;主要含有以下信息&#xff1a;对象的大小和种类。 域&#xff1a;对象使用者在对象…

Veeam中国区“十年换四帅”

数据保护厂商Veeam登顶了&#xff01; 傲视群雄 8月&#xff0c;Gartner《2023年全球企业备份和恢复软件市场份额分析报告》显示&#xff0c;Veeam市场占有率居所有厂商中的第一位——其市场份额为15.1%&#xff0c;收入为15亿美元&#xff0c;2023年相比2022年增长11.8%。 数据…

深度学习(七)-计算机视觉基础

计算机视觉 计算机视觉在广义上是和图像相关的技术总称。包括图像的采集获取&#xff0c;图 像的压缩编码&#xff0c;图像的存储和传输&#xff0c;图像的合成&#xff0c;三维图像重建&#xff0c;图像增强&#xff0c;图像修复&#xff0c;图像的分类和识别&#xff0c;目…

Adobe Illustrator非矢量图片的交集利用剪切蒙版实现

AI不支持对于非矢量图片的交集处理&#xff0c;但是可以通过剪切蒙版类似地实现需求。 如下图&#xff0c;字母F是一张PNG图片&#xff0c;为位图文件&#xff08;非矢量&#xff09;。 现在我需要将这种图片与黑色的矩形求交&#xff1a; 将两个目标全部选中&#xff0c;鼠标…