代码审计-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 环境搭建步骤

  1. 数据库配置:

    • 使用Navicat创建数据库
    • 字符集选择utf8,排序规则选择utf8_bin
    • 导入项目中的sql.sql文件
  2. 配置文件修改:

    • 修改application.yml中的数据库连接信息
  3. 启动项目:

    • 通过StudentmanagerApplication.java启动
    • 默认端口8080

2. 安全审计方法论

本次审计采用半黑盒+半白盒的方法:

  1. 首先审查pom.xml了解项目依赖
  2. 全局搜索常见危险模式
  3. 功能点测试与代码审计结合
  4. 重点关注:
    • SQL注入
    • XSS漏洞
    • 文件上传漏洞
    • CSRF漏洞
    • 权限绕过

3. 漏洞分析与挖掘

3.1 SQL注入审计

审计过程

  1. 检查MyBatis使用方式
  2. 全局搜索${符号(MyBatis未预处理的危险字符)
  3. 检查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漏洞

发现点

  1. 学生信息修改页面的"姓名"字段
  2. 教师课程管理中的"课程名称"字段

测试payload

<script>alert(1)</script>

漏洞特点

  • 存储型XSS
  • 但输入长度受限(32字符)
  • 危害有限,仅能实现弹窗

3.4 任意文件上传漏洞

发现位置

  • /student/editStudent路由
  • StudentController.java中的editStudent方法

漏洞特征

  1. 无文件类型检查
  2. 无内容校验
  3. 仅对文件名进行随机化处理

限制

  • 无法上传JSP木马(纯Spring MVC不解析JSP)

利用方式

  1. 上传恶意HTML文件实现重定向
    <script>window.location.href="https://www.baidu.com"</script>
    
  2. 需要重启项目后才能访问(静态资源编译时加载)

3.5 CSRF漏洞

发现位置

  • 添加学生功能(/student/addStudent)
  • 无CSRF防护机制

利用链

  1. 通过XSS或文件上传植入恶意HTML
  2. 构造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. 教师查看学生信息时自动触发

触发条件

  • 需要用户点击查看包含恶意代码的图片/页面

影响范围

  • 学生↔教师
  • 教师↔管理员
  • 多种操作(添加、删除等)

3.6 垂直越权漏洞

发现位置

  1. StudentController.java中的addStudent方法
  2. 请假审批功能(LeaveController.java中的checkLeave方法)

漏洞特征

  • 部分方法缺少身份验证
  • 仅依赖session存在性,不验证角色

测试步骤

  1. 使用学生账号捕获教师操作请求
  2. 修改cookie为学生session
  3. 成功执行教师权限操作

关键代码

// 添加学生方法(无权限检查)
@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防御

  1. 对所有用户输入进行HTML编码
  2. 使用框架提供的防护机制(如Spring的<c:out>
  3. 设置合理的输入长度限制

4.2 文件上传安全

  1. 实施白名单文件类型检查
  2. 验证文件内容(如图片必须可解析)
  3. 设置独立的文件存储域
  4. 禁用HTML文件上传

4.3 CSRF防护

  1. 添加CSRF Token机制
  2. 关键操作使用POST请求
  3. 检查Referer头

4.4 权限控制

  1. 统一权限验证框架(如Spring Security)
  2. 方法级权限注解(如@PreAuthorize
  3. 最小权限原则

4.5 会话管理

  1. 设置合理的会话超时
  2. 敏感操作重新认证
  3. 防止会话固定

5. 审计经验总结

  1. 审计顺序建议

    • 先查pom.xml了解技术栈
    • 检查安全相关配置
    • 从高危漏洞开始(SQL注入→XSS→越权等)
    • 最后检查业务逻辑漏洞
  2. MyBatis审计要点

    • 区分#{}${}使用
    • 检查动态SQL拼接
    • 关注order by等特殊场景
  3. Spring MVC审计要点

    • 拦截器配置
    • 静态资源处理
    • 参数绑定方式
  4. 漏洞联动思维

    • XSS+CSRF组合利用
    • 文件上传+XSS组合
    • 越权+信息泄露组合
  5. 工具辅助

    • 使用IDE全局搜索功能
    • Burp Suite抓包分析
    • 代码静态分析工具

6. 扩展思考

  1. 如何自动化发现类似漏洞?
  2. 业务逻辑漏洞的深度挖掘方法
  3. 微服务架构下的安全审计差异
  4. 前端框架(如Vue/React)对传统Web漏洞的影响

通过本案例的系统审计,可以建立起基础的Java Web应用安全审计方法论,为更复杂项目的安全评估打下坚实基础。

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 :配置拦截规则 拦截器逻辑 : 拦截器配置 : 排除路径: /upload/** 尝试绕过: /upload/../任意路由 → 失败(Spring MVC会自动规范化路径) 结论 : 拦截器实现正确,无法直接绕过 3.3 XSS漏洞 发现点 : 学生信息修改页面的"姓名"字段 教师课程管理中的"课程名称"字段 测试payload : 漏洞特点 : 存储型XSS 但输入长度受限(32字符) 危害有限,仅能实现弹窗 3.4 任意文件上传漏洞 发现位置 : /student/editStudent 路由 StudentController.java 中的 editStudent 方法 漏洞特征 : 无文件类型检查 无内容校验 仅对文件名进行随机化处理 限制 : 无法上传JSP木马(纯Spring MVC不解析JSP) 利用方式 : 上传恶意HTML文件实现重定向 需要重启项目后才能访问(静态资源编译时加载) 3.5 CSRF漏洞 发现位置 : 添加学生功能( /student/addStudent ) 无CSRF防护机制 利用链 : 通过XSS或文件上传植入恶意HTML 构造CSRF POC: 教师查看学生信息时自动触发 触发条件 : 需要用户点击查看包含恶意代码的图片/页面 影响范围 : 学生↔教师 教师↔管理员 多种操作(添加、删除等) 3.6 垂直越权漏洞 发现位置 : StudentController.java 中的 addStudent 方法 请假审批功能( LeaveController.java 中的 checkLeave 方法) 漏洞特征 : 部分方法缺少身份验证 仅依赖session存在性,不验证角色 测试步骤 : 使用学生账号捕获教师操作请求 修改cookie为学生session 成功执行教师权限操作 关键代码 : 注意事项 : 操作期间不能退出账号(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应用安全审计方法论,为更复杂项目的安全评估打下坚实基础。