记一次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

环境搭建

  1. 下载项目并等待Maven依赖加载完成
  2. 修改配置文件:my-springsecurity-plus/src/main/resources/application.yml
  3. 创建数据库并导入SQL文件:my-springsecurity-plus/docs/sql/my-springsecurity-plus.sql
  4. 配置JDK 1.8环境
  5. 启动项目后访问:http://127.0.0.1:8088/login.html
  6. 使用默认管理员账号:admin/123456

漏洞挖掘与分析

1. SQL注入漏洞

第一处注入点:字典管理功能

漏洞位置

  • Mapper文件:my-springsecurity-plus/src/main/resources/mybatis-mappers/DictMapper.xml
  • 关键代码:使用${}进行字符串拼接而非预编译#{}

调用链分析

  1. 从Mapper文件找到SQL语句
  2. 根据id追踪到Dao层方法
  3. 向上追踪到Controller层:DictController.java
  4. 分析getDictPage方法参数传递

漏洞复现

  1. 在后台找到字典查询功能点
  2. 使用Burp Suite抓包
  3. 确认参数名与代码对应
  4. 使用SQLMap进行自动化测试

修复情况:新版本已修复

第二处注入点:部门管理功能

漏洞位置

  • Mapper文件:my-springsecurity-plus/src/main/resources/mybatis-mappers/DeptMapper.xml
  • 参数来源:继承自BaseEntity.javaparams参数

特殊点分析

  • params参数不是直接出现在Controller中
  • 继承关系:BaseEntity是抽象类,被数据库操作类继承
  • 参数传递方式特殊:params["dataScope"]形式

漏洞复现

  1. 构造特殊URL:http://192.168.37.1:8088/api/dept/build?params%5B%22dataScope%22%5D=1
  2. 需要对特殊字符进行URL编码
  3. 使用SQLMap验证

修复情况:新版本未修复

2. XSS(存储型)漏洞

漏洞位置

  1. 用户创建功能
  2. 用户编辑功能

漏洞验证

  1. 创建普通用户时插入XSS payload
  2. 管理员查看用户列表时触发
  3. 编辑用户信息时插入XSS payload
  4. 管理员查看时触发

修复情况:新版本未修复,缺乏参数校验

3. 垂直越权漏洞

漏洞位置:用户删除功能

漏洞分析

  1. 删除操作仅校验userID参数
  2. 普通用户可删除同级用户
  3. 数据库操作仅依赖user_id条件

漏洞复现

  1. 抓取删除用户的数据包
  2. 修改userID为同级用户ID
  3. 成功执行删除操作

修复情况:新版本通过JWT身份认证修复

4. Druid未授权访问(不存在)

分析过程

  1. 发现pom.xml中有Druid依赖
  2. 后台存在Druid监控功能
  3. 代码中配置了IP访问限制
  4. 尝试XFF头绕过失败
  5. 分析IP获取逻辑:
    • 使用request.getRemoteAddr()方法
    • 本地搭建DNS服务器测试
    • 确认无法绕过IP限制

结论:不存在未授权访问漏洞

修复情况:新版本取消了POST方法的未授权访问

5. Spring Boot Actuator未授权访问

发现过程

  1. pom.xml中发现Actuator依赖
  2. 检查配置文件开放的端点

风险端点

  • /info:显示应用基本信息
  • /health:显示健康状态
  • /beans:显示所有Spring Beans
  • /env:显示环境变量(可能泄露敏感信息)
  • /metrics:显示度量信息

重点风险

  • /env端点可能泄露数据库密码等敏感信息
  • 密码会进行脱敏处理,但可通过heapdump分析获取明文

修复情况:新版本禁止未授权访问/actuator

6. Swagger API泄露

发现过程

  1. pom.xml中发现Swagger依赖
  2. 设置了静态资源路径

风险验证

  1. 直接访问Swagger UI:http://127.0.0.1:8088/swagger-ui.html#/
  2. 获取API文档:http://127.0.0.1:8088/v2/api-docs
  3. 使用工具批量测试接口:
    • 工具:swagger-hack
    • 命令:python swagger-hack2.0.py -u "http://ip:8088/v2/api-docs"

修复情况:新老版本无差别,均存在风险

审计方法论总结

  1. 依赖分析

    • 首先检查pom.xml文件
    • 重点关注:MyBatis、Druid、Actuator、Swagger等组件
  2. SQL注入审计

    • 全局搜索${查找动态SQL拼接
    • 分析Mapper文件与Controller调用链
    • 注意特殊参数传递方式
  3. XSS审计

    • 检查用户输入点
    • 验证参数是否经过过滤
    • 测试存储型和反射型场景
  4. 权限审计

    • 分析权限校验逻辑
    • 测试越权操作
    • 检查JWT等认证机制
  5. 组件审计

    • 检查Actuator端点配置
    • 验证Druid等监控组件访问控制
    • 测试Swagger等文档接口
  6. 工具使用

    • 使用Burp Suite进行请求抓取和修改
    • 使用SQLMap验证SQL注入
    • 使用专用工具测试Swagger接口

修复建议

  1. SQL注入

    • 使用预编译#{}替代${}
    • 添加参数类型检查
    • 使用MyBatis的拦截器进行统一过滤
  2. XSS防护

    • 对所有用户输入进行HTML编码
    • 使用XSS过滤器
    • 设置CSP策略
  3. 权限控制

    • 完善权限校验逻辑
    • 使用Spring Security的权限注解
    • 实现数据级权限控制
  4. Actuator安全

    • 限制端点暴露:management.endpoints.web.exposure.include
    • 添加认证要求
    • 敏感信息脱敏
  5. Swagger安全

    • 生产环境关闭Swagger
    • 添加访问控制
    • 使用Spring Security保护接口
  6. 监控组件安全

    • 为Druid等监控界面添加强认证
    • 限制访问IP
    • 修改默认路径

总结思考

  1. Spring Boot框架审计需要关注框架特性和组件安全
  2. 审计应从依赖分析开始,逐步深入业务逻辑
  3. 常见漏洞包括:注入、XSS、越权、配置不当等
  4. 工具辅助审计可提高效率,但需结合手动分析
  5. 安全防护应贯穿开发全过程,而非后期修补

通过本次审计,我们系统性地分析了Spring Boot应用的常见安全问题,并提出了相应的防护措施,为开发安全的Spring Boot应用提供了实践指导。

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应用提供了实践指导。