简述: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 数据库文件,即可直接运行主类。

随后访问后台地址:http://localhost:8088/logins 即可。请注意避免端口冲突。
CSRF漏洞
登录系统后台,在“用户面板”处,发现“修改便签”功能存在 CSRF(跨站请求伪造)漏洞。

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

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

SQL注入漏洞
代码分析
首先,在项目的 pom.xml 文件中确认其使用了 MyBatis 依赖:

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

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

可以看到 outtype 参数直接拼接到了 SQL 语句中,符合 SQL 注入的条件。接下来需要找到调用此 SQL 的接口。
全局搜索 allDirector 方法名,定位到 Mapper 接口层:

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

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

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

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

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

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

事实上,从最初的 XML 文件分析,baseKey、pinyin 等其他几个参数同样存在 SQL 注入风险。
存储型XSS漏洞
登录后台后,在用户管理页面点击修改用户信息,在“真实姓名”等字段插入 XSS 代码(如 <script>alert(“a”)</script>),提交保存后成功触发弹窗。

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

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

经测试,该后台系统多处存在类似的无过滤输入点,均可直接插入 XSS 代码执行。
任意文件读取漏洞
在 UserpanelController 控制器中,以下代码存在逻辑缺陷,可能导致任意文件读取:

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

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

如上图红框所示,f.getPath() 由 rootpath 和 path 拼接而成。path 的值来源于 request.getRequestURI(),并移除了其中的 /image 前缀。
那么 rootpath 的值是什么呢?在该类中搜索 rootpath,找到其定义:

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

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

构造如下的请求,成功读取到了该文件内容:
GET /image../../../../../../Data(D:)/upload/test.txt

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