代码审计 | 某edu CMS漏洞分析
字数 1168 2025-08-29 08:30:18
某edu CMS漏洞分析教学文档
一、系统概述
1. 技术架构
- 前端框架: LayUI
- 模板引擎: FreeMarker
- 后端技术:
- Java语言开发
- Spring + SpringMVC + MyBatis框架组合
- 数据库: MySQL
2. 角色功能
- 管理员:
- 编辑公告
- 批量导入学生/教师/课程基本信息
- 增删改查功能
- 系统接口访问权限控制
- 教师:
- 录入学生成绩
- 查看自己的课程/学生信息
- 结束课程
- 默认密码与账号相同
- 学生:
- 选课功能
- 成绩查询
- 默认密码与账号相同
3. 项目搭建
- 下载源码并使用IntelliJ IDEA导入
- 创建相应数据库并修改配置信息
- 访问地址: http://127.0.0.1:8888 (后台)
二、组件安全审计
审计的组件及版本:
- Druid: 1.1.22 → 无已知漏洞
- MyBatis: 1.3.2 → 无已知漏洞
- Fastjson: 1.2.62 → 无已知漏洞
三、单点漏洞分析
1. 越权漏洞
漏洞位置
权限拦截器中的判断逻辑存在缺陷:
if (url.contains(auth.getUrl()) || auth.getUrl().contains(url.split("/")[0])) {
return true;
}
漏洞分析
-
误判风险:
url.contains(auth.getUrl())可能导致权限误判- 示例: 权限URL为
/user,请求URL为/userinfo会被误判为匹配成功
-
数组越界风险:
url.split("/")[0]存在数组越界风险- 当URL不包含
/时,split("/")[0]返回空值,导致条件始终为真
复现步骤
- 以学生身份登录系统
- 访问学生角色本无权限访问的路径
- 验证可以成功访问,证明越权漏洞存在
2. XSS漏洞(公告系统)
漏洞位置
- 路由:
/notice/addPage - 受影响参数:
title和author
漏洞分析
- 前端代码直接使用未过滤的参数:
body.find("#author").val(edit.author);
- 未对
edit.author进行任何过滤或转义处理 - 攻击者可注入恶意JavaScript代码
3. XSS漏洞(学生管理)
漏洞位置
- 路由:
/student/add - 受影响参数:
major和grade
漏洞分析
- 后端未对输入参数进行任何过滤或验证
- 攻击者可通过提交恶意参数值实现XSS攻击
4. XSS漏洞(教师端)
漏洞说明
- 教师端存在与学生端类似的XSS漏洞
- 漏洞原理与复现方式相同
四、修复建议
1. 越权漏洞修复
- 修改权限判断逻辑,使用精确匹配而非包含匹配
- 添加URL规范化处理
- 示例修复代码:
if (url.equals(auth.getUrl()) || url.startsWith(auth.getUrl() + "/")) {
return true;
}
2. XSS漏洞修复
- 对所有用户输入进行HTML编码
- 使用安全的输出编码函数
- 实施内容安全策略(CSP)
- 示例修复代码:
body.find("#author").text(escapeHtml(edit.author));
五、总结
该edu CMS系统存在多处安全漏洞,包括:
- 权限校验不严导致的越权访问
- 多处未过滤用户输入导致的存储型XSS漏洞
建议开发者对所有用户输入进行严格验证,并重构权限校验机制。