代码审计 | 你一定会审的java系统
字数 1710 2025-08-18 17:33:40

Java代码审计教学文档:学生管理系统安全分析

1. 背景与目标

本教学文档基于一个典型的学生管理系统Java项目进行代码审计实践,目标是:

  • 掌握Java CMS系统代码审计的基本流程
  • 建立Java代码审计的checklist
  • 识别常见安全漏洞及其修复方法

2. 环境准备

2.1 系统要求

  • 操作系统:Windows 10
  • JDK版本:1.8.0_172
  • 数据库:MySQL 5.7(可使用PHPstudy集成环境)
  • 开发工具:IDEA 2022.2专业版(版本可自选)

2.2 项目部署步骤

  1. 从Gitee克隆源码:https://gitee.com/huang-yk/student-manage
  2. 创建数据库:cms
  3. 导入SQL文件
  4. 修改核心配置文件:application-local.yml
  5. 加载pom.xml中的依赖
  6. 运行启动文件
  7. 访问系统:http://localhost:8888/login/loginPage
    • 默认账号:admin/123456

3. 项目结构分析

3.1 目录结构

  • 典型的Spring Boot项目结构
  • 包含标准的MVC分层:controller、service、dao、entity等

3.2 技术栈分析(通过pom.xml)

  • Web框架:Spring Boot
  • 数据库访问:MyBatis
  • 安全框架:Shiro
  • JSON处理:Fastjson
  • 日志组件:Log4j

4. 代码审计实践

4.1 Fastjson反序列化审计

审计方法

  1. 使用IDEA全局搜索(Shift+Ctrl+F)以下关键词:
    • parse(
    • parseObject(

审计结果

  • 未发现反序列化函数调用
  • 结论:不存在Fastjson反序列化漏洞

4.2 验证码绕过漏洞

4.2.1 黑盒测试

  1. 发现登录页面存在验证码刷新机制
  2. 使用Burp Suite抓包测试
  3. 观察发现:
    • 登录失败时不是302跳转回登录页
    • 验证码未在后端刷新

4.2.2 漏洞验证

  1. 固定一个验证码值
  2. 使用Burp Intruder进行暴力破解
  3. 确认可以绕过验证码限制进行爆破

4.2.3 源码分析

// 漏洞代码示例(简化版)
@PostMapping("/login")
public String login(String username, String password, String captcha) {
    // 问题1:验证码未与session绑定
    // 问题2:验证码未在失败后刷新
    if(!captcha.equalsIgnoreCase(当前验证码)){
        return "验证码错误";
    }
    // 验证用户名密码...
}

修复建议

  1. 验证码应与session绑定
  2. 每次验证后无论成功与否都应刷新验证码
  3. 限制单位时间内尝试次数

4.3 SQL注入审计

审计方法

  1. 项目使用MyBatis框架
  2. 全局搜索 ${(MyBatis中表示直接拼接SQL的参数符号)
  3. 检查DAO层的XML映射文件

审计结果

  • 未发现 ${ 的使用
  • 确认使用 #{} 预编译方式
  • 结论:不存在SQL注入漏洞

4.4 其他潜在审计点

4.4.1 Shiro配置审计

  1. 检查是否使用默认密钥
  2. 检查rememberMe功能实现
  3. 检查权限控制是否完善

4.4.2 Log4j配置审计

  1. 检查日志配置是否关闭了JNDI查找
  2. 检查是否有敏感信息记录

4.4.3 XSS审计

  1. 检查响应头是否设置了Content-Type
  2. 检查是否配置了XSS过滤器
  3. 检查前端渲染方式(如Thymeleaf是否自动转义)

5. Java代码审计Checklist

5.1 组件安全

  • [ ] Fastjson版本及使用方式
  • [ ] Log4j版本及配置
  • [ ] Shiro配置及实现
  • [ ] MyBatis SQL注入防护

5.2 功能安全

  • [ ] 认证授权机制
  • [ ] 验证码实现
  • [ ] 会话管理
  • [ ] 敏感操作防护

5.3 输入输出

  • [ ] XSS防护
  • [ ] CSRF防护
  • [ ] 文件上传验证
  • [ ] 重定向验证

5.4 配置安全

  • [ ] 生产环境配置
  • [ ] 敏感信息泄露
  • [ ] 错误处理机制

6. 总结

通过本次代码审计实践,我们:

  1. 确认了验证码绕过漏洞的存在及修复方案
  2. 验证了Fastjson和MyBatis的安全使用
  3. 建立了基本的Java代码审计checklist
  4. 掌握了使用IDEA进行全局搜索的审计技巧

后续建议

  1. 扩展审计其他安全风险点
  2. 对发现的漏洞进行修复验证
  3. 建立自动化审计流程
  4. 持续更新审计checklist
Java代码审计教学文档:学生管理系统安全分析 1. 背景与目标 本教学文档基于一个典型的学生管理系统Java项目进行代码审计实践,目标是: 掌握Java CMS系统代码审计的基本流程 建立Java代码审计的checklist 识别常见安全漏洞及其修复方法 2. 环境准备 2.1 系统要求 操作系统:Windows 10 JDK版本:1.8.0_ 172 数据库:MySQL 5.7(可使用PHPstudy集成环境) 开发工具:IDEA 2022.2专业版(版本可自选) 2.2 项目部署步骤 从Gitee克隆源码: https://gitee.com/huang-yk/student-manage 创建数据库: cms 导入SQL文件 修改核心配置文件: application-local.yml 加载 pom.xml 中的依赖 运行启动文件 访问系统: http://localhost:8888/login/loginPage 默认账号:admin/123456 3. 项目结构分析 3.1 目录结构 典型的Spring Boot项目结构 包含标准的MVC分层:controller、service、dao、entity等 3.2 技术栈分析(通过pom.xml) Web框架:Spring Boot 数据库访问:MyBatis 安全框架:Shiro JSON处理:Fastjson 日志组件:Log4j 4. 代码审计实践 4.1 Fastjson反序列化审计 审计方法 : 使用IDEA全局搜索(Shift+Ctrl+F)以下关键词: parse( parseObject( 审计结果 : 未发现反序列化函数调用 结论:不存在Fastjson反序列化漏洞 4.2 验证码绕过漏洞 4.2.1 黑盒测试 发现登录页面存在验证码刷新机制 使用Burp Suite抓包测试 观察发现: 登录失败时不是302跳转回登录页 验证码未在后端刷新 4.2.2 漏洞验证 固定一个验证码值 使用Burp Intruder进行暴力破解 确认可以绕过验证码限制进行爆破 4.2.3 源码分析 修复建议 : 验证码应与session绑定 每次验证后无论成功与否都应刷新验证码 限制单位时间内尝试次数 4.3 SQL注入审计 审计方法 : 项目使用MyBatis框架 全局搜索 ${ (MyBatis中表示直接拼接SQL的参数符号) 检查DAO层的XML映射文件 审计结果 : 未发现 ${ 的使用 确认使用 #{} 预编译方式 结论:不存在SQL注入漏洞 4.4 其他潜在审计点 4.4.1 Shiro配置审计 检查是否使用默认密钥 检查rememberMe功能实现 检查权限控制是否完善 4.4.2 Log4j配置审计 检查日志配置是否关闭了JNDI查找 检查是否有敏感信息记录 4.4.3 XSS审计 检查响应头是否设置了Content-Type 检查是否配置了XSS过滤器 检查前端渲染方式(如Thymeleaf是否自动转义) 5. Java代码审计Checklist 5.1 组件安全 [ ] Fastjson版本及使用方式 [ ] Log4j版本及配置 [ ] Shiro配置及实现 [ ] MyBatis SQL注入防护 5.2 功能安全 [ ] 认证授权机制 [ ] 验证码实现 [ ] 会话管理 [ ] 敏感操作防护 5.3 输入输出 [ ] XSS防护 [ ] CSRF防护 [ ] 文件上传验证 [ ] 重定向验证 5.4 配置安全 [ ] 生产环境配置 [ ] 敏感信息泄露 [ ] 错误处理机制 6. 总结 通过本次代码审计实践,我们: 确认了验证码绕过漏洞的存在及修复方案 验证了Fastjson和MyBatis的安全使用 建立了基本的Java代码审计checklist 掌握了使用IDEA进行全局搜索的审计技巧 后续建议 : 扩展审计其他安全风险点 对发现的漏洞进行修复验证 建立自动化审计流程 持续更新审计checklist