找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2104

积分

0

好友

278

主题
发表于 5 小时前 | 查看: 5| 回复: 0

简述:OASYS 是一个采用 Maven 管理的 OA 办公自动化系统,其技术栈基于 Spring Boot 框架,使用 MySQL 作为底层数据库。前端部分采用了 Freemarker 模板引擎和 Bootstrap UI 框架,后端则集成了 JPA、MyBatis 等常用框架。

项目源码下载地址:https://github.com/misstt123/oasys

部署过程相当简单:我使用了 PHPStudy 中的 MySQL 5.7 版本,修改 application.properties 配置文件后,在 IDEA 中导入 oasys.sql 数据库文件,即可直接运行主类。

Spring Boot OASYS项目主类代码

随后访问后台地址:http://localhost:8088/logins 即可。请注意避免端口冲突。

CSRF漏洞

登录系统后台,在“用户面板”处,发现“修改便签”功能存在 CSRF(跨站请求伪造)漏洞。

OASYS管理系统用户面板界面

点击“修改”按钮并抓取数据包,在 Burp Suite 中右键选择“Engagement tools” -> “Generate CSRF PoC”:

Burp Suite生成CSRF PoC界面

将生成的 PoC URL 复制到浏览器中访问,可以看到便签内容已经按照 PoC 中的预设被成功修改,验证了漏洞的存在。

HTTP请求与响应结果图

SQL注入漏洞

代码分析

首先,在项目的 pom.xml 文件中确认其使用了 MyBatis 依赖:

MyBatis Maven依赖配置

在项目中全局搜索 ${(MyBatis 中可能导致 SQL 注入的占位符写法),发现多处使用。

全局搜索MyBatis ${}占位符结果

重点关注 outtype 参数,定位到其所在的 XML 映射文件:

MyBatis XML映射文件中的SQL语句

可以看到 outtype 参数直接拼接到了 SQL 语句中,符合 SQL 注入的条件。接下来需要找到调用此 SQL 的接口。

全局搜索 allDirector 方法名,定位到 Mapper 接口层:

AddressMapper Java接口定义

接着查找该接口的实现或引用处,发现其在 AddrController 中被调用:

AddrController中引用Mapper接口

在该 Controller 中搜索 allDirector 方法,定位到具体的业务代码块:

Controller层调用Mapper方法代码

从代码中可以看出,outtype 等参数未经任何过滤便直接传入 MyBatis 的 Mapper 方法中。根据代码注释(处理外部通讯录),我们进行漏洞复现。

Controller请求映射注解

漏洞复现

在系统后台找到“通讯录” -> “外部通讯录”功能页面。

OASYS通讯录管理界面

通过抓包,找到对应请求的数据包:

外部通讯录查询请求包

将数据包中的 localhost 替换为测试环境的 IP 地址,使用 sqlmap 进行验证,成功识别出 SQL 注入点:

sqlmap成功检测出SQL注入漏洞

事实上,从最初的 XML 文件分析,baseKeypinyin 等其他几个参数同样存在 SQL 注入风险。

存储型XSS漏洞

登录后台后,在用户管理页面点击修改用户信息,在“真实姓名”等字段插入 XSS 代码(如 <script>alert(“a”)</script>),提交保存后成功触发弹窗。

用户信息编辑处触发XSS弹窗

根据提交请求的接口(useredit)进行全局搜索,定位到处理逻辑:

搜索用户编辑接口结果

分析对应代码,发现用户输入的数据未经任何过滤就直接保存到数据库,导致了存储型 XSS 漏洞。

用户编辑功能后端处理代码

经测试,该后台系统多处存在类似的无过滤输入点,均可直接插入 XSS 代码执行。

任意文件读取漏洞

UserpanelController 控制器中,以下代码存在逻辑缺陷,可能导致任意文件读取:

UserpanelController中的图片处理代码

这段代码本意是处理图片请求,并将文件数据写入 HTTP 响应。我们来详细分析其逻辑:

文件读取与路径处理代码段

红色框出的代码逻辑很清晰:获取 f.getPath() 对应的文件,通过 FileInputStream 读取并输出到响应流。问题的关键在于 f.getPath() 是如何构造的。

文件路径拼接逻辑代码

如上图红框所示,f.getPath()rootpathpath 拼接而成。path 的值来源于 request.getRequestURI(),并移除了其中的 /image 前缀。

那么 rootpath 的值是什么呢?在该类中搜索 rootpath,找到其定义:

rootpath配置属性注入代码

rootpath 通过 @Value 注解从配置文件中获取。查看 application.properties 配置文件:

application.properties中的路径配置

至此,我们明白了整个逻辑:代码期望读取 img.rootpath 配置目录下的图片文件,但 path 参数是通过替换 URI 中的 /image 得到的。如果我们构造一个包含多个 /image.. 的路径,就可以实现目录穿越。

假设我在 D 盘 upload 目录下有一个测试文件 test.txt

D盘upload目录下的test.txt文件

构造如下的请求,成功读取到了该文件内容:

GET /image../../../../../../Data(D:)/upload/test.txt

成功读取服务器D盘文件内容

这证实了任意文件读取漏洞的存在。对于像 OASYS 这类由 Spring Boot 构建的实战项目进行源码审计,是发现和深入理解此类安全问题的绝佳途径,相关讨论和资源也可以在 云栈社区 的技术安全板块找到更多案例。




上一篇:DeepSeek-V4延期:梁文锋用长期记忆LTM挑战AI原生记忆时代
下一篇:Karpathy AI职业暴露度分析项目引热议:LLM评估342类岗位,6000万白领工作风险几何
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-17 05:59 , Processed in 0.489719 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表