实战|记一次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),通常是一个接口,继承自 JpaRepositoryCrudRepository

保存和更新方法:

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。

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

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

相关文章

C#基于SkiaSharp实现印章管理(2)

上一篇文章最后提到基于System.Text.Json能够序列化SKColor对象&#xff0c;但是反序列化时却无法解析本地json数据。换成Newtonsoft.Json进行序列化和反序列化也是类似的问题。   通过百度及查看微软的帮助文档&#xff0c;上述情况下需自定义转换类以处理SKColor类型数据的…

搜维尔科技:【研究】触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验

自然交互可提高VR模拟的有效性。研究表明&#xff0c;触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验。 以下是验证 医疗培训中的触觉技术 “ 95.5%的参与者表示触摸是 XR 教育的重要组成部分&#xff0c;90.9% 的参与者表示 XR 触觉将提供一个安全的学习场所。…

经典文献阅读之--MobileViT(轻量级、通用且移动友好的网络框架)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

尚品汇-(七)

&#xff08;1&#xff09;在网关中实现跨域 全局配置类实现 包名&#xff1a;com.atguigu.gmall.gateway.config 创建CorsConfig类 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsWebFilter(){// cors跨域配置对象CorsConfiguration configuration…

私有化部署ChatGPT:潜力与挑战

背景 以ChatGPT为代表的大语言模型服务在2023年初开始大规模爆发&#xff0c;AI技术从来没有如此接近普通民众。随着以Microsoft&#xff0c; Google&#xff0c; Meta &#xff08;Facebook&#xff09;为代表的科技巨头在AI技术领域相继发布重量级产品和服务&#xff0c;国内…

声场合成新方法:基于声波传播的框架

声场合成是指在房间内的麦克风阵列上&#xff0c;根据来自房间内其他位置的声源信号&#xff0c;合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务&#xff0c;因为它是一种成本效益高的方法&#xff0c;用于数据生成以替代真实的数据收集&#xff0c;后…

武汉星起航:挂牌上海股权交易中心,自营店铺销售额迎飞跃式增长

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司而言&#xff0c;无疑是一个载入史册的重要日子。这一天&#xff0c;公司成功在上海股权托管交易中心挂牌展示&#xff0c;正式登陆资本市场&#xff0c;开启了全新的发展篇章。这一里程碑式的跨越&#xff0c;不仅彰…

IDEA中Maven--下载安装自己适配的版本---理解

Maven解释&#xff1a; Maven是一个强大的项目管理工具和构建工具&#xff0c;主要用于Java项目。它能够帮助开发团队管理项目的依赖、构建项目、发布文档和报告&#xff0c;并能够自动化许多重复的任务。 Maven的主要作用包括&#xff1a; 依赖管理&#xff1a;Maven能够管理…

6.2 通过构建情感分类器训练词向量

在上一节中&#xff0c;我们简要地了解了词向量&#xff0c;但并没有去实现它。在本节中&#xff0c;我们将下载一个名为IMDB的数据集(其中包含了评论)&#xff0c;然后构建一个用于计算评论的情感是正面、负面还是未知的情感分类器。在构建过程中&#xff0c;还将为 IMDB 数据…

第二期书生·浦语大模型实战营优秀项目一览

书生浦语社区于 2023 年年底正式推出了书生浦语大模型实战营系列活动&#xff0c;至今已有两期五批次同学参加大模型学习、实战&#xff0c;线上课程累计学习超过 10 万人次。 实战营特设项目实践环节&#xff0c;提供 A100 算力支持&#xff0c;鼓励学员动手开发。第 2 期实战…

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

HarmonyOS Next开发学习手册——进程模型线程模型

进程模型 系统的进程模型如下图所示&#xff1a; 应用中&#xff08;同一包名&#xff09;的所有PageAbility、ServiceAbility、DataAbility、FormAbility运行在同一个独立进程中&#xff0c;即图中绿色部分的“Main Process”。 WebView拥有独立的渲染进程&#xff0c;即图中…

2023: 芒种集•序言

2023: 芒种集•序言 2023: 芒种集•序言 从西南旅游回来&#xff0c;一直忙着整理游记“2024&#xff1a;追寻红色足迹”&#xff0c;之后又应初建平索要刘桂蓉遗作“我们一起走过”&#xff0c;于是把“别了&#xff0c;老屋”和诗作“二月”一并合编&#xff0c;把我写的悼念…

oceanbase数据库安装和连接实战(阿里云服务器操作)

本文主要是安装oceanbase的单机版进行数据库的基础使用&#xff0c;oceanbase的数据库是兼容mysql数据库的&#xff0c;实际的兼容程度需要更深度的测试&#xff0c;本文主要是安装oceanbase并使用SQLynx的mysql驱动连接使用oceanbase数据库。 目录 1. 基础介绍 2. 安装说明 …

【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间

文章目录 前言一、datetime模块简介二、常用类和方法三、date类四、time类五、datetime类六、timedelta类七、常用的函数和属性八、代码及其演示 前言 Python的datetime模块提供了日期和时间的类&#xff0c;用于处理日期和时间的算术运算。这个模块包括date、time、datetime和…

STL迭代器的基础应用

STL迭代器的应用 迭代器的定义方法&#xff1a; 类型作用定义方式正向迭代器正序遍历STL容器容器类名::iterator 迭代器名常量正向迭代器以只读方式正序遍历STL容器容器类名::const_iterator 迭代器名反向迭代器逆序遍历STL容器容器类名::reverse_iterator 迭代器名常量反向迭…

C# SerialPort串口通讯

串口通信 在.NET平台下创建C#串口通信程序&#xff0c;.NET 2.0提供了串口通信的功能&#xff0c;其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口&#xff0c;还可以和串口设备进行通信。 创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重…

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整&#xff0c;主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

文化财经wh6boll带macd多空转折点提示指标公式源码

文化财经wh6boll带macd多空转折点提示指标公式源码&#xff1a; DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA); MID:MA(CLOSE,26);//求N个周期的收盘价均线&#xff0c;称为布林通道中轨 TMP2:STD(CLOSE,26);//求M个周期内的收盘价的标准差 …

onlyoffice实现在单页面加载文档的功能

草图 实现案例的基本原型 这里我们的样式库使用的是Tailwindcss&#xff0c;我们的前端UI组件库使用的是Ant Design Vue。 基本原型是&#xff0c;有个按钮&#xff0c;没有点击按钮的时候&#xff0c;页面显示的时普通的内容。当点击这个按钮的时候&#xff0c;页面加载文档…