基于springboot架构项目的白盒审计经验分享
字数 1497 2025-08-11 17:40:15
SpringBoot项目白盒审计实战指南
一、背景与概述
Java语言因其面向对象、跨平台执行、高可移植性及丰富类库的特点,在CMS(内容管理系统)开发中占据重要地位。随着CMS功能增强,安全问题日益突出,代码审计成为安全研究员必备技能。
二、SpringBoot核心概念
2.1 SpringBoot特点
- 轻量级框架,内置Tomcat/Jetty等Web容器
- 无需部署WAR文件,简化配置
- 通过Starter简化项目构建
2.2 与Spring框架对比
- Spring需要大量XML配置
- SpringBoot自动配置,约定优于配置
- SpringBoot是Spring的"上层框架"
三、SpringBoot项目搭建
3.1 环境准备
- JDK 8+
- IntelliJ IDEA
- MySQL 8.0+
- Maven 3.8+
3.2 项目结构
SpringbootdemoApplication - 主启动类(基于main方法)
application.yml - 配置文件(端口/上下文路径等)
pom.xml - Maven依赖管理
3.3 关键依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
四、SpringBoot集成关键组件
4.1 Spring Security集成
安全框架功能:
- 提供声明式安全访问控制
- 基于IoC和AOP实现
集成步骤:
- 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 自定义认证逻辑:
public class CustomUserDetailsService implements UserDetailsService {
// 实现数据库用户认证
}
4.2 MyBatis集成
持久层框架:
- Java对象与数据库表映射
- 提供CRUD操作API
集成步骤:
- 添加依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
- 配置数据源(application.yml):
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbname
username: root
password: password
- 编写Mapper XML文件:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
4.3 模板引擎集成
FreeMarker集成
- 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 创建模板文件(.ftlh):
<#list users as user>
<p>${user.name}</p>
</#list>
Thymeleaf集成
- 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 创建模板文件(.html):
<div th:each="user : ${users}">
<p th:text="${user.name}"></p>
</div>
五、白盒审计实战(以MCMS为例)
5.1 环境搭建
- 下载源码:https://gitee.com/mingSoft/MCMS/releases
- 导入数据库
- 修改application.yml配置
- 默认凭证:msopen/msopen
5.2 审计关键点
5.2.1 组件版本检查
- 检查pom.xml中组件版本:
- Log4j
- Fastjson
- Shiro
- MyBatis
5.2.2 SQL注入审计
- 搜索MyBatis XML中的
${}参数占位符 - 发现风险代码:
<select id="findByCategory" resultType="Content">
SELECT * FROM cms_content
WHERE category_id IN
(SELECT id FROM cms_category
WHERE find_in_set('${categoryId}',CATEGORY_PARENT_IDS)>0)
</select>
- 定位调用链:
- 前端接口:
/ms/cms/content/list - 后端代码:
ContentAction.java - 参数传递:无过滤直接使用
- 验证利用:
sqlmap -u "http://127.0.0.1:8080/ms/cms/content/list?categoryId=1" --dbs
5.2.3 文件上传审计
- 前端限制:仅允许zip/html/png/jpg
- 后端验证:
- 上传路径可控
- 文件类型检查不严格
- 绕过方法:
- 上传包含恶意文件的zip
- 直接访问上传路径
5.2.4 Shiro框架审计
- 检查密钥泄漏
- 测试默认凭证
- 检查权限控制
5.3 审计方法论
-
项目结构分析:
- 查看启动类和配置文件
- 理解业务架构
-
输入点追踪:
- 关注Controller层参数接收
- 检查过滤和验证逻辑
-
危险函数定位:
- SQL拼接(
${}) - 文件操作(File/Path)
- 反序列化(ObjectInputStream)
- SQL拼接(
-
工具辅助:
- IDEA全局搜索(Shift+Shift)
- BurpSuite拦截分析
- SQLMap自动化测试
六、防御建议
-
SQL注入防护:
- 使用
#{}替代${} - 实施参数化查询
- 添加输入过滤
- 使用
-
文件上传安全:
- 服务端文件类型验证
- 随机化存储路径
- 限制执行权限
-
组件安全:
- 及时更新依赖版本
- 禁用不必要功能
- 最小权限原则
-
框架加固:
- Shiro配置复杂密钥
- Spring Security启用CSRF
- 输入输出编码