实战|记一次java协同办公OA系统源码审计
前言
因为笔者也是代码审计初学者,写得不好的地方请见谅。该文章是以项目实战角度出发,希望能给大家带来启发。
审计过程
审计思路
1、拿到一个项目首先要看它使用了什么技术框架,是使用了ssh框架,还是使用了ssm框架,还是servlet等。
2、看看是否使用了shiro、spring security等统一的权限控制框架,如果未使用,则可以重点梳理一下逻辑漏洞。
3、通过lib、pom等查看开源组件版本信息,看看是否存在通用漏洞。
通过目录通识项目
从目录可知,该项目是ssh框架

审计SQL注入
思路:
1、追踪参数是否来自前端,并且来自前端的参数未经过安全处理。在jdbc技术、hibernate中使用+进行拼接,在mybatis中使用$符号拼接。
2、关键词直接搜:like、in、order by、group by等等
在上面提到该项目使用了ssh框架,也就是说项目如果使用了sql语句,则会用+进行拼接。所以按住ctrl+shift+R进行关键词全局搜索,like、IN、order by、group by,然后看看 SQL 是不是用加号 + 的就行了。
先搜索like,然后拉下来浏览文件,发现没有使用+拼接,所以这处不存在sql注入。

搜索in,然后拉下来浏览文件,然后点击进去

发现参数以数组绑定方式进行传参,有效地防止sql注入

搜索order by,然后拉下来浏览文件

随便点几个看看,发现order by后面的不是参数,所以不存在sql注入

搜索group by,发现没有SQL注入

审计XSS注入
思路:全局搜索XSS关键字是否设置了防御XSS的过滤且是否生效,因为有时候开发为了性能,虽然设置了XSS全局过滤器,但是没有开启,这也会导致XSS注入发生,也或者开启了全局过滤XSS,但是排除了某些API,那么这也会导致XSS注入事件发生。
注意:XSS全局过滤器无法过滤上传文件的内容,即可以上传一个带有弹窗功能代码的文件,这个也会导致XSS发生。
审计过程如下:
首先全局搜索XSS,发现似乎有xss防御机制。

点进去仔细分析一下看看,发现有一个正则匹配,

这个正则表达式的目的是在进行字符串检测时,优先考虑 ID 选择器(即以 # 开头的情况),以避免通过 location.hash 属性引发的 XSS 攻击。location.hash 是 URL 的片段标识符,如果直接将其内容当作 HTML 解析,可能导致安全漏洞。因此,通过优先识别 ID 选择器,可以有效降低这种攻击的风险。
但是 <script>alert('111')</script> 这样的字符串不能被这个正则表达式防止,因为这个正则表达式的主要目的是快速识别和区分 HTML 片段和 ID 选择器,并不是用于防止 XSS 攻击。
验证:
随便找一处,看看存不存在XSS注入。


点击保存,发现弹窗,即证明存在存储型xss注入。

从源码上分析:
首先根据页面特征找到对应的源码
我这里是通过【类型管理】找到对应的源码。

点进去看看是否能对应

看到上面的界面貌似是对应的后端,但是不敢确定所以打个断点,然后从前端提交数据,看看能不能进来

如下图所示,即找到了对应的后端。

补充:在Spring MVC中
@Valid 注解
-
@Valid 是一个用于启动Java Bean Validation的注解。它表示要对传入的对象(在这个例子中是
SystemTypeList实体)进行验证。 -
当你在方法参数上使用
@Valid注解时,Spring会自动根据实体类中的注解(如@NotNull,@Size,@Min,@Max等)对传入的数据进行验证。 -
如果验证失败,验证错误信息会被存储在
BindingResult对象中。
BindingResult 参数
-
BindingResult 是一个Spring框架提供的接口,用于存储验证结果和绑定错误。
-
BindingResult必须紧跟在需要验证的对象参数之后,否则Spring会抛出一个异常。 -
如果验证失败,
BindingResult对象会包含错误信息。你可以使用它来检查是否有验证错误,并获取具体的错误信息利用下面这行代码进行校验
ResultVO res = BindingResultVOUtil.*hasErrors*(br);点击下一步,发现校验成功
-

校验成功,又因为我们不是通过编辑的界面来到的,所以来到下面这一步

当来到这一步时候,我们在想,这个会不会保存进去数据库里面,从而造成存储型XSS

我们看一下save方法是怎么样实现的

可以看到

知识补充:
上一个代码片段是一个 Spring 服务类的部分实现,使用了 Spring Data JPA 来处理数据库操作。让我们详细解释一下这个实现:
@Autowired private TypeDao typeDao;
@Autowired 注解用于自动注入 TypeDao 实例。TypeDao 是一个数据访问对象(DAO),通常是一个接口,继承自 JpaRepository 或 CrudRepository。
保存和更新方法:
public SystemTypeList save(SystemTypeList list) { return typeDao.save(list); }
上面这个方法接受一个 SystemTypeList 对象,并调用 typeDao.save(list) 将其保存到数据库中。
typeDao.save(list) 是 Spring Data JPA 提供的方法,它会根据 list 对象的主键值来决定是进行插入操作(新增)还是更新操作。我们这里是插入操作。
总结:到了这里,相信大家都明白了代码逻辑了吧,我们从前端传入参数,后端在接受到参数时不进行任何过滤操作而直接对前端传来的参数进行处理并且插入了数据库里面,所以导致了存储型XSS注入。
审计文件上传
审计思路:
1、文件上传可以搜索以下关键词:
File
**FileUpload**
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile com.oreilly.servlet.MultipartRequest
write
fileName
filePath
2、在查看时,主要判断是否有检查后缀和文件的大小
3、查看配置文件是否有设置白名单或者黑名单(不推荐黑名单,可能被绕过)
实战审计过程如下:
可能是笔者习惯吧,就是在进行白盒审计的时候,总喜欢在前端页面找到功能点,然后再去找程序入口,我看有的师傅是关键词直接搜,然后再审,然后再找到前端进行验证(虽然有一些漏洞笔者审计思路也是这样),废话不多说,马上开干。
首先在前端找到一个文件上传功能点

接着,根据前端特征,如文件管理,上传,("file")等关键词,直接全局搜索。
找到一个貌似是对应的后端代码

还不确定,再根据路由(fileupload),这个一般都是通过action传过来的,直接搜前端代码,看到这个前端页面,看到很明显是对应的代码,如果想要再次确认,可以打开再次与浏览器上面的web界面对比。

那么,现在就要开始打断点调试了。

笔者经过反复的测试,发现xxx.jsp、xxx.jspx都不能被解析,也就是说,不能getshell,那么好不容易找到一个上传点,真的要止步于此了嘛,再结合黑盒的经验,看看能不能混个XSS漏洞。又想起这是任意文件上传的,那么,能不能上传一个带有弹窗代码的.html文件呢?经过测试确实可以这样。
1111111.html的文件内容如下:
<script>alert('1111');</script>

来到下面这一步,可以发现这一步是保存文件的

然后找到savefile这个方法

来到实现savefile方法的文件,发现这个方法没有对前端传来的文件作任何处理。

知识补充:
transferTo 方法是 Java 中 MultipartFile 接口的一部分,用于将上传的文件直接写入目标文件。这个方法在 Spring MVC 中非常常见,因为它可以高效地处理文件上传。
transferTo主要功能
transferTo 方法将 MultipartFile 实例表示的文件内容直接传输到文件系统中的一个目标文件。与手动处理文件流相比,它提供了一种更简单且高效的方式来保存文件。
那么,我们的项目中的文件就是通过这个transferTo 方法将文件写入的。

点击下一步,就把带有弹窗代码的文件成功写入。

访问一下,看看能不能被解析。

很好,文件类XSS漏洞+1。
相关文章:
实战|记一次java协同办公OA系统源码审计
前言 因为笔者也是代码审计初学者,写得不好的地方请见谅。该文章是以项目实战角度出发,希望能给大家带来启发。 审计过程 审计思路 1、拿到一个项目首先要看它使用了什么技术框架,是使用了ssh框架,还是使用了ssm框架ÿ…...
浅浅谈谈如何利用Javase+多线程+计算机网络的知识做一个爬CSDN阅读量总访问量的程序
目录 我们发现csdn的文章 首先为了印证我们的想法 我们用postman往csdn我们任意一篇文章发起post请求 发送请求 编辑获得响应结果 我们发现我们的阅读量上涨 PostRequestSender类 但是我们经过测试发现 定义一个字符串数组 把URL放进去 然后延迟启动 在线程池里面…...
Vscode 中launch.json与tasks.json文件
Vscode 中launch.json与tasks.json文件 launch.json文件基本结构主要属性示例配置PythonCNode.js 常见配置项1. Python2. C3. Node.js 使用示例 tasks.json基本结构主要属性示例配置C 编译任务Python 运行任务Node.js 运行任务 常见配置项使用示例 tasks.json与launch.json文件…...
C#基于SkiaSharp实现印章管理(2)
上一篇文章最后提到基于System.Text.Json能够序列化SKColor对象,但是反序列化时却无法解析本地json数据。换成Newtonsoft.Json进行序列化和反序列化也是类似的问题。 通过百度及查看微软的帮助文档,上述情况下需自定义转换类以处理SKColor类型数据的…...
大二C++期末复习(自用)
一、类 1.定义成员函数 输入年份判断是否是闰年,若是输出年份;若不是,输出NO #include<iostream> #include<cstring> using namespace std; class TDate{private:int month;int day;int year;public:TDate(int y,int m,int d)…...
重大进展!微信支付收款码全场景接入银联网络
据中国银联6月19日消息,近日,银联网络迎来微信支付收款码场景的全面接入,推动条码支付互联互通取得新进展,为境内外广大消费者提供更多支付选择、更好支付体验。 2024年6月,伴随微信支付经营收款码的开放,微…...
msvcr110.dll丢失的解决方法,亲测有效的几种解决方法
最近,我在启动一个程序时,系统突然弹出一个错误提示,告诉我电脑缺失了一个名为msvcr110.dll的文件。这让我感到非常困惑,因为我之前从未遇到过这样的问题。经过一番搜索和尝试,我总结了5种靠谱的解决方法。下面分享给大…...
SUSE Linux 15 sp5上Nginx安装配置升级
1.安装SUSE linux 15 SP5 图形化界面安装很简单,选择最小安装,安装好后,使用vim编辑配置文件,结果提示"bash: vim: command not found"。 最简安装把一些常用命令都整没有了,于是又重新选择了Server Applica…...
突破Web3红海,DePIN如何构建创新生态系统?
撰文:TinTinLand 本文来源香港Web3媒体Techub News专栏作者TinTinLand 2023 年 DePIN 赛道的火热成为 Web3 行业的重点关注方向,当前如何以可扩展、去中心化、安全方式推动 DePIN 赛道赋能下的 AI 版图建设,寻找更多 Web3 行业创新机遇成为…...
裸机与操做系统区别(RTOS)
声明:该系列笔记是参考韦东山老师的视频,链接放在最后!!! rtos:这种系统只实现了内核功能,比较简单,在嵌入式开发中,某些情况下我们只需要多任务,而不需要文件…...
详解 ClickHouse 的分片集群
一、简介 分片功能依赖于 Distributed 表引擎,Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据 ClickHouse 进行分片集群的…...
AI问答-医疗:什么是“手术报台”
手术报台并不是传统意义上的医疗工具或设备,而是一个与手术耗材追溯管理相关的系统或工具。以下是对手术报台的详细解释: 一、定义与功能 手术报台系统,如医迈德手术报台系统,是一款面向医院跟台人员的微信小程序。 它通过手术耗…...
S-Clustr(影子集群)V3 高并发,去中心化,多节点控制
S-Clustr 项目地址:https://github.com/MartinxMax/S-Clustr/releases/tag/S-Clustr-V3.0 Maptnh Не ограничивайте свои действия виртуальным миром. GitHub: Maptnh Jay Steinberg Man kann die Menschen, die man hasst, in d…...
支持WebDav的网盘infiniCloud(静读天下,Zotero 等挂载)
前言 WebDav是一种基于HTTP的协议,允许用户在Web上直接编辑和管理文件,如复制、移动、删除等。 尽管有一些网盘支持WebDav,但其中大部分都有较多的使用限制。这些限制可能包括:上传文件的大小限制、存储空间的限制、下载速度的限…...
Linux命令行导出MySQL数据库备份并压缩
Linux命令行导出MySQL数据库备份并压缩 导出SQL: 如果使用的是 MySQL 或者 MariaDB 可以使用mysqldump工具进行数据备份的导出; 基本命令: mysqldump -u用户名 -p密码 数据库名称 > 要导出的文件名.sql替换掉你实际的数据库“用户名”…...
二叉树的广度优先搜索(层次遍历)
目录 定义 层序遍历的数据结构 实现过程简述 具体代码 定义 层序遍历就是从左到右一层一层地遍历二叉树。 层序遍历的数据结构 层序遍历需要借用一个辅助数据结构实现,由于队列具有先进先出的特性,符合一层一层遍历的逻辑,而栈先进后出…...
AU音频重新混合音频,在 Adobe Audition 中无缝延长背景音乐,无缝缩短BGM
导入音频,选中音频,并且点 New Multitrack Session 的图标 设计文件名和存储路径,然后点 OK 点 Essential Sound 面板点 Music (如果没有这个面板 点菜单栏 Windows > Essential Sound 调出来) 点 Duration 展…...
11-Django项目--Ajax请求二
目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…...
代码评审——Java占位符%n的处理
问题描述 在软件开发项目中,特别是在处理动态内容生成与呈现至前端界面的过程中,正确运用占位符以确保文本完整性和数据准确性显得尤为重要。不当的占位符管理不仅可能导致语法错误或逻辑混乱,还会引发一系列隐蔽的问题,这些问题…...
超低排放标准
据朗观视觉小编了解发现,超低排放标准作为衡量一个行业或企业环保水平的重要指标,越来越受到社会各界的关注。本文将深入探讨超低排放标准的内涵、实施意义以及未来展望。 一、超低排放标准的定义 超低排放标准,是指在特定工业生产过程中&am…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
