实战|记一次java协同办公OA系统源码审计

news2024/10/5 20:22:29

前言

因为笔者也是代码审计初学者,写得不好的地方请见谅。该文章是以项目实战角度出发,希望能给大家带来启发。

审计过程

审计思路

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.coloradmin.cn/o/1866736.html

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

相关文章

阿里提出MS-Diffusion:一键合成你喜爱的所有图像元素,个性化生成新思路!

文本到图像生成模型的最新进展极大地增强了从文本提示生成照片级逼真图像的能力&#xff0c;从而增加了人们对个性化文本到图像应用的兴趣&#xff0c;尤其是在多主题场景中。然而&#xff0c;这些进步受到两个主要挑战的阻碍&#xff1a; 需要根据文本描述准确维护每个参考主题…

黑马程序员Java基础学习,涉及精细知识点复习【持续更新】

文章目录 01java基础java基础面向对象1.类&#xff1a;2.成员变量&#xff1a;类中方法外的变量&#xff0c;不能赋值3.成员方法&#xff1a;4.java内存分配&#xff1a;5.成员变量有初始值&#xff0c;局部变量没有初始值。6.this关键字&#xff1a;7.封装&#xff1a;8.构造方…

软硬链接 以及 动静态链接

目录 1 软硬链接 2 动静态库 1 软硬链接 不知道大家也没有仔细看过我们的 windows 中的快捷方式的内容&#xff0c;我们右键点开一个快捷方式然后查看其属性&#xff0c;我们发现有一个 目标 的内容 这个目标是一串路径&#xff0c;这也就是我们的程序的安装路径中的一个.exe…

AWS在国内的持续受欢迎:探究背后的原因

亚马逊云&#xff08;AWS&#xff09;作为全球领先的云计算服务提供商&#xff0c;在国内市场仍然保持着强劲的竞争力和广泛的用户群。尽管国内也有一些本土云计算服务提供商的崛起&#xff0c;但AWS在国内仍然有大量的用户在使用。我们九河云&#xff0c;一直致力AWS云相关服务…

mapstruct实现各个实体间的类型转换(DTO转BO、BO转Entity)的实践

一、引入 在没有遇见mapstruct的时候&#xff0c;实现各个实体之间的转换&#xff0c;都是手动转换实现的&#xff0c;属性少一带你还好&#xff0c;当属性一多&#xff0c;代码就会变得很冗余&#xff0c;没必要的非逻辑的代码就会加多。。。。 比如&#xff1a; public cl…

对https://registry.npm.taobao.org/tyarn的请求失败,原因:证书过期

今天安装yarn时&#xff0c;报错如下&#xff1a; request to https://registry.npm.taobao.org/yarn failed, reason: certificate has expired 原来淘宝镜像过期了&#xff0c;需要重新搞一下 记录一下解决过程&#xff1a; 1.查看当前npm配置 npm config list 2.清…

Vite: 集成Lint工具规范代码

概述 在前端开发中&#xff0c;尤其是在大型项目中&#xff0c;代码的规范性和一致性对于项目的可维护性、可读性以及团队协作效率至关重要。为了保障代码质量&#xff0c;前端社区涌现出了许多Lint工具&#xff0c;如ESLint、Prettier、Stylelint等&#xff0c;它们能帮助我们…

高考成绩加分,西藏学生推荐使用的《藏文翻译词典》APP,藏文作文高考大纲,初中高中学习内容与考试同步更新!

2024年高考成绩出炉啦&#xff01;在这个特别的时刻&#xff0c;我想向大家表达最真挚的祝贺。高考不仅是一场考试&#xff0c;更是你多年学习旅程的一次总结。当你的成绩揭晓&#xff0c;无论结果如何&#xff0c;你都应该为自己感到骄傲。 在高原&#xff0c;藏语如同雪山上…

切线与切平面的可视化

切线与切平面的可视化 flyfish 切线的可视化 import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation, PillowWriter# 定义一个简单的一元函数&#xff0c;例如 f(x) x^2 def func(x):return x**2# 计算函数的导数 def deriva…

鸿蒙开发Ability Kit(程序框架服务):【FA模型切换Stage模型指导】 app和deviceConfig的切换

app和deviceConfig的切换 为了便于开发者维护应用级别的属性配置&#xff0c;Stage模型将config.json中的app和deviceConfig标签提取到了app.json5中进行配置&#xff0c;并对部分标签名称进行了修改&#xff0c;具体差异见下表。 表1 配置文件app标签差异对比 配置项FA模型…

MindSpore中NumPy变量转换为Tensor张量使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝

在NumPy转换为Tensor使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝 使用Tensor()将NumPy变量转换为Tensor变量。 类似数组转换张量的方法 n np.ones(5) t Tensor.from_numpy(n) print(f"t: {t}", type(t)) np.add(n, 1, outn) print(f"n: {n}"…

导航栏设计的5种类型,新手不容忽视的重要知识!

导航栏是网页设计中不可缺少的一部分。大多数用户在浏览网页时都是从导航栏开始的。导航栏的作用相当于路标和书籍中的目录&#xff0c;其重要性不言而喻。从设计的角度来看&#xff0c;网页导航栏的设计功能大于视觉效果。因此&#xff0c;网页导航栏的设计可以分为 5 类型&am…

Java后端 || ElementUI 显示后端树形表格数据

文章目录 1、前端源码2、数据库设计3、后端设计3.1、实体类3.2、Controller层3.3、具体树形列表后端代码实现 1、前端源码 ElementUI Table 链接 在此链接中找到 树形数据与懒加载 查看其JS源码&#xff0c;可知&#xff0c;每个菜单节点的子节点存放于children字段中&#x…

直播分享|TinyVue 组件库主题适配原理与实战

在前端开发过程中&#xff0c;不同的项目可能需要不同的设计风格。而了解组件库的主题适配功能&#xff0c;也可以帮助开发者轻松定制独特的主题风格&#xff0c;从而满足各种设计需求。因此6月27日晚19点&#xff0c;体验技术团队 TinyVue 项目成员岑灌铭老师将为大家带来以《…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch5 蒙特卡洛方法【model-based ——> model-free】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、 过 电子书 是否遗漏 【下载&#xff1a;本章 PDF GitHub 页面链接 】 【第二轮 才整理的&#xff0c;忘光了。。。又看了一遍视频】 3、 过 MOOC 习题 看 PDF 迷迷糊糊&#xff0c; 恍恍惚惚。…

Swift 周报 第五十五期

文章目录 前言新闻和社区苹果公司据悉将推出密码管理应用三大指数涨跌不一&#xff0c;苹果重新夺回美股第二大上市公司宝座苹果iOS 18新动向&#xff1a;AI功能强化隐私保护&#xff0c;用户自主选择启用 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言…

springboot + Vue前后端项目(第十九记)

项目实战第十九记 写在前面1. redis安装(windows安装)1.1 获取软件链接地址&#xff1a;1.2 启动redis1.3 测试是否启动成功1.4 通过 Another Redis DeskTop软件可视化查看redis 2. SpringBoot集成redis2.1 引入依赖2.2 注入RedisTemplate2.3 使用redis2.4 redis更新2.5 redis使…

【经验分享】Claude3.5 Sonnet六大可扩展用途

Claude3.5 Sonnet六大可扩展用途 概述 Claude 3.5 Sonnet的性能比其他大模型都有好&#xff0c;本文基于Claude3.5 Sonnet的Artifact功能进行讨论和分析&#xff0c;提供了Claude3.5 Sonnet的六大可扩展用途。 用途 1.画SVG图像 2.设计网站 3.设计徽标 4.设计游戏 5.分…

JavaScript的学习之dom的查询(一)

一、获得元素 通过document对象调用&#xff1a; getElementById()&#xff1a;通过id属性获取一个元素节点对象getElementsByTagName()&#xff1a;通过标签名获取一组元素节点对象getElementsByName()&#xff1a;通过name属性来获取一组元素节点对象 核心学习代码 <scrip…

【语义分割】1-标注数据集-【单张图片】labelme标注json文件转mask

声明&#xff1a;我学习了b站&#xff1a;标注自己的语义分割数据集_哔哩哔哩_bilibili 并且复现了&#xff0c;记录了所思所得。 主要是说了&#xff1a; 做语义分割&#xff0c;数据集怎么用labelme标注成json文件&#xff0c;以及&#xff0c;json文件怎么转成mask 流程…