代码审计-studentmanager
字数 2124 2025-08-29 22:41:32
Java Web应用安全审计实战:StudentManager项目漏洞分析与挖掘
1. 项目概述与环境搭建
1.1 项目简介
StudentManager是一个基于Spring MVC的学生管理系统,适合Java审计新手练习。项目采用以下技术栈:
- JDK 1.8
- MySQL 5.5
- Tomcat 7
- MyBatis作为ORM框架
1.2 环境搭建步骤
-
数据库配置:
- 使用Navicat创建数据库
- 字符集选择utf8,排序规则选择utf8_bin
- 导入项目中的sql.sql文件
-
配置文件修改:
- 修改application.yml中的数据库连接信息
-
启动项目:
- 通过StudentmanagerApplication.java启动
- 默认端口8080
2. 安全审计方法论
本次审计采用半黑盒+半白盒的方法:
- 首先审查pom.xml了解项目依赖
- 全局搜索常见危险模式
- 功能点测试与代码审计结合
- 重点关注:
- SQL注入
- XSS漏洞
- 文件上传漏洞
- CSRF漏洞
- 权限绕过
3. 漏洞分析与挖掘
3.1 SQL注入审计
审计过程:
- 检查MyBatis使用方式
- 全局搜索
${符号(MyBatis未预处理的危险字符) - 检查SQL映射文件
结论:
- 所有SQL语句都使用
#{}进行参数绑定 - 不存在SQL注入漏洞
3.2 拦截器与权限控制
关键文件:
LoginInterceptor.java:登录检测拦截器SpringmvcConfig.java:配置拦截规则
拦截器逻辑:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("userInfo") == null){
response.sendRedirect(request.getContextPath() + "/system/login");
return false;
}
return true;
}
拦截器配置:
- 排除路径:
/upload/** - 尝试绕过:
/upload/../任意路由→ 失败(Spring MVC会自动规范化路径)
结论:
- 拦截器实现正确,无法直接绕过
3.3 XSS漏洞
发现点:
- 学生信息修改页面的"姓名"字段
- 教师课程管理中的"课程名称"字段
测试payload:
<script>alert(1)</script>
漏洞特点:
- 存储型XSS
- 但输入长度受限(32字符)
- 危害有限,仅能实现弹窗
3.4 任意文件上传漏洞
发现位置:
/student/editStudent路由StudentController.java中的editStudent方法
漏洞特征:
- 无文件类型检查
- 无内容校验
- 仅对文件名进行随机化处理
限制:
- 无法上传JSP木马(纯Spring MVC不解析JSP)
利用方式:
- 上传恶意HTML文件实现重定向
<script>window.location.href="https://www.baidu.com"</script> - 需要重启项目后才能访问(静态资源编译时加载)
3.5 CSRF漏洞
发现位置:
- 添加学生功能(
/student/addStudent) - 无CSRF防护机制
利用链:
- 通过XSS或文件上传植入恶意HTML
- 构造CSRF POC:
<html> <body> <form action="http://target/student/addStudent" method="POST"> <input type="hidden" name="name" value="attacker" /> <input type="hidden" name="clazzId" value="1" /> <!-- 其他必要字段 --> </form> <script>document.forms[0].submit();</script> </body> </html> - 教师查看学生信息时自动触发
触发条件:
- 需要用户点击查看包含恶意代码的图片/页面
影响范围:
- 学生↔教师
- 教师↔管理员
- 多种操作(添加、删除等)
3.6 垂直越权漏洞
发现位置:
StudentController.java中的addStudent方法- 请假审批功能(
LeaveController.java中的checkLeave方法)
漏洞特征:
- 部分方法缺少身份验证
- 仅依赖session存在性,不验证角色
测试步骤:
- 使用学生账号捕获教师操作请求
- 修改cookie为学生session
- 成功执行教师权限操作
关键代码:
// 添加学生方法(无权限检查)
@RequestMapping("/addStudent")
public String addStudent(Student student) {
// 直接处理,不验证调用者身份
}
// 获取学生列表(有权限检查)
@RequestMapping("/getStudentList")
public String getStudentList(HttpServletRequest request, Model model) {
User user = (User) request.getSession().getAttribute("userInfo");
if(user.getUserType().equals("teacher")){
// 教师逻辑
} else {
// 学生逻辑
}
}
注意事项:
- 操作期间不能退出账号(session会失效)
4. 漏洞修复建议
4.1 XSS防御
- 对所有用户输入进行HTML编码
- 使用框架提供的防护机制(如Spring的
<c:out>) - 设置合理的输入长度限制
4.2 文件上传安全
- 实施白名单文件类型检查
- 验证文件内容(如图片必须可解析)
- 设置独立的文件存储域
- 禁用HTML文件上传
4.3 CSRF防护
- 添加CSRF Token机制
- 关键操作使用POST请求
- 检查Referer头
4.4 权限控制
- 统一权限验证框架(如Spring Security)
- 方法级权限注解(如
@PreAuthorize) - 最小权限原则
4.5 会话管理
- 设置合理的会话超时
- 敏感操作重新认证
- 防止会话固定
5. 审计经验总结
-
审计顺序建议:
- 先查pom.xml了解技术栈
- 检查安全相关配置
- 从高危漏洞开始(SQL注入→XSS→越权等)
- 最后检查业务逻辑漏洞
-
MyBatis审计要点:
- 区分
#{}和${}使用 - 检查动态SQL拼接
- 关注order by等特殊场景
- 区分
-
Spring MVC审计要点:
- 拦截器配置
- 静态资源处理
- 参数绑定方式
-
漏洞联动思维:
- XSS+CSRF组合利用
- 文件上传+XSS组合
- 越权+信息泄露组合
-
工具辅助:
- 使用IDE全局搜索功能
- Burp Suite抓包分析
- 代码静态分析工具
6. 扩展思考
- 如何自动化发现类似漏洞?
- 业务逻辑漏洞的深度挖掘方法
- 微服务架构下的安全审计差异
- 前端框架(如Vue/React)对传统Web漏洞的影响
通过本案例的系统审计,可以建立起基础的Java Web应用安全审计方法论,为更复杂项目的安全评估打下坚实基础。