记一次Spring boot框架代审与思考
字数 2947 2025-08-22 22:47:30
Spring Boot框架代码审计与安全加固指南
项目概述
审计对象是一个基于Spring Boot + Spring Security的RBAC权限管理系统,具有以下特点:
- 采用Spring Security实现权限控制
- 无重度依赖,适合新手练习
- 文档详细,从零开始
- 项目地址:https://gitee.com/witmy/my-springsecurity-plus
环境搭建
- 下载项目并等待Maven依赖加载完成
- 修改配置文件:
my-springsecurity-plus/src/main/resources/application.yml - 创建数据库并导入SQL文件:
my-springsecurity-plus/docs/sql/my-springsecurity-plus.sql - 配置JDK 1.8环境
- 启动项目后访问:
http://127.0.0.1:8088/login.html - 使用默认管理员账号:admin/123456
漏洞挖掘与分析
1. SQL注入漏洞
第一处注入点:字典管理功能
漏洞位置:
- Mapper文件:
my-springsecurity-plus/src/main/resources/mybatis-mappers/DictMapper.xml - 关键代码:使用
${}进行字符串拼接而非预编译#{}
调用链分析:
- 从Mapper文件找到SQL语句
- 根据id追踪到Dao层方法
- 向上追踪到Controller层:
DictController.java - 分析
getDictPage方法参数传递
漏洞复现:
- 在后台找到字典查询功能点
- 使用Burp Suite抓包
- 确认参数名与代码对应
- 使用SQLMap进行自动化测试
修复情况:新版本已修复
第二处注入点:部门管理功能
漏洞位置:
- Mapper文件:
my-springsecurity-plus/src/main/resources/mybatis-mappers/DeptMapper.xml - 参数来源:继承自
BaseEntity.java的params参数
特殊点分析:
params参数不是直接出现在Controller中- 继承关系:
BaseEntity是抽象类,被数据库操作类继承 - 参数传递方式特殊:
params["dataScope"]形式
漏洞复现:
- 构造特殊URL:
http://192.168.37.1:8088/api/dept/build?params%5B%22dataScope%22%5D=1 - 需要对特殊字符进行URL编码
- 使用SQLMap验证
修复情况:新版本未修复
2. XSS(存储型)漏洞
漏洞位置:
- 用户创建功能
- 用户编辑功能
漏洞验证:
- 创建普通用户时插入XSS payload
- 管理员查看用户列表时触发
- 编辑用户信息时插入XSS payload
- 管理员查看时触发
修复情况:新版本未修复,缺乏参数校验
3. 垂直越权漏洞
漏洞位置:用户删除功能
漏洞分析:
- 删除操作仅校验
userID参数 - 普通用户可删除同级用户
- 数据库操作仅依赖
user_id条件
漏洞复现:
- 抓取删除用户的数据包
- 修改
userID为同级用户ID - 成功执行删除操作
修复情况:新版本通过JWT身份认证修复
4. Druid未授权访问(不存在)
分析过程:
- 发现pom.xml中有Druid依赖
- 后台存在Druid监控功能
- 代码中配置了IP访问限制
- 尝试XFF头绕过失败
- 分析IP获取逻辑:
- 使用
request.getRemoteAddr()方法 - 本地搭建DNS服务器测试
- 确认无法绕过IP限制
- 使用
结论:不存在未授权访问漏洞
修复情况:新版本取消了POST方法的未授权访问
5. Spring Boot Actuator未授权访问
发现过程:
- pom.xml中发现Actuator依赖
- 检查配置文件开放的端点
风险端点:
/info:显示应用基本信息/health:显示健康状态/beans:显示所有Spring Beans/env:显示环境变量(可能泄露敏感信息)/metrics:显示度量信息
重点风险:
/env端点可能泄露数据库密码等敏感信息- 密码会进行脱敏处理,但可通过heapdump分析获取明文
修复情况:新版本禁止未授权访问/actuator
6. Swagger API泄露
发现过程:
- pom.xml中发现Swagger依赖
- 设置了静态资源路径
风险验证:
- 直接访问Swagger UI:
http://127.0.0.1:8088/swagger-ui.html#/ - 获取API文档:
http://127.0.0.1:8088/v2/api-docs - 使用工具批量测试接口:
- 工具:
swagger-hack - 命令:
python swagger-hack2.0.py -u "http://ip:8088/v2/api-docs"
- 工具:
修复情况:新老版本无差别,均存在风险
审计方法论总结
-
依赖分析:
- 首先检查pom.xml文件
- 重点关注:MyBatis、Druid、Actuator、Swagger等组件
-
SQL注入审计:
- 全局搜索
${查找动态SQL拼接 - 分析Mapper文件与Controller调用链
- 注意特殊参数传递方式
- 全局搜索
-
XSS审计:
- 检查用户输入点
- 验证参数是否经过过滤
- 测试存储型和反射型场景
-
权限审计:
- 分析权限校验逻辑
- 测试越权操作
- 检查JWT等认证机制
-
组件审计:
- 检查Actuator端点配置
- 验证Druid等监控组件访问控制
- 测试Swagger等文档接口
-
工具使用:
- 使用Burp Suite进行请求抓取和修改
- 使用SQLMap验证SQL注入
- 使用专用工具测试Swagger接口
修复建议
-
SQL注入:
- 使用预编译
#{}替代${} - 添加参数类型检查
- 使用MyBatis的拦截器进行统一过滤
- 使用预编译
-
XSS防护:
- 对所有用户输入进行HTML编码
- 使用XSS过滤器
- 设置CSP策略
-
权限控制:
- 完善权限校验逻辑
- 使用Spring Security的权限注解
- 实现数据级权限控制
-
Actuator安全:
- 限制端点暴露:
management.endpoints.web.exposure.include - 添加认证要求
- 敏感信息脱敏
- 限制端点暴露:
-
Swagger安全:
- 生产环境关闭Swagger
- 添加访问控制
- 使用Spring Security保护接口
-
监控组件安全:
- 为Druid等监控界面添加强认证
- 限制访问IP
- 修改默认路径
总结思考
- Spring Boot框架审计需要关注框架特性和组件安全
- 审计应从依赖分析开始,逐步深入业务逻辑
- 常见漏洞包括:注入、XSS、越权、配置不当等
- 工具辅助审计可提高效率,但需结合手动分析
- 安全防护应贯穿开发全过程,而非后期修补
通过本次审计,我们系统性地分析了Spring Boot应用的常见安全问题,并提出了相应的防护措施,为开发安全的Spring Boot应用提供了实践指导。