代码审计 | 你一定会审的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 项目部署步骤
- 从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 源码分析
// 漏洞代码示例(简化版)
@PostMapping("/login")
public String login(String username, String password, String captcha) {
// 问题1:验证码未与session绑定
// 问题2:验证码未在失败后刷新
if(!captcha.equalsIgnoreCase(当前验证码)){
return "验证码错误";
}
// 验证用户名密码...
}
修复建议:
- 验证码应与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