java代码审计之某办公oa
字数 1752 2025-08-25 22:58:20
OA办公自动化系统安全审计报告
项目概述
OASYS是一个基于SpringBoot框架开发的OA办公自动化系统,主要技术栈包括:
- 项目管理:Maven
- 数据库:MySQL
- 前端框架:Freemarker模板引擎 + Bootstrap
- 持久层:集成JPA和Mybatis
环境搭建
- 创建MySQL数据库
oasys - 导入
oasys.sql文件初始化数据库结构 - 修改
application.properties配置文件中的数据库连接信息 - 启动项目
漏洞分析
1. SQL注入漏洞
1.1 通知列表SQL注入
漏洞位置:
- 映射文件:
notice-mapper.xml - 控制器:
InformController.java
漏洞原因:
MyBatis映射文件中使用了${}进行字符串拼接,导致SQL注入风险。
关键代码:
<!-- notice-mapper.xml -->
<select id="selectid" resultType="cn.gson.oasys.model.entity.notice.Notice">
SELECT * FROM aoa_notice_list WHERE title LIKE '%${title}%'
</select>
控制器调用:
// InformController.java
@RequestMapping("/informlistpaging")
public String informlistpaging(@RequestParam(value="baseKey",required=false)String baseKey, ...) {
// ...
List<Notice> notices = noticeMapper.sortMyNotice(user.getUserId(), baseKey, ...);
// ...
}
漏洞验证:
- 报错注入Payload:
http://localhost:8089/informlistpaging?baseKey=1' and (select extractvalue("0x7e",concat('~',(select user())))a) and '1'='1
- 时间盲注Payload:
http://localhost:8089/informlistpaging?baseKey=1' and (select * from(select(sleep(2)))a) and '1'='1%23
1.2 通讯录SQL注入
漏洞位置:
- 映射文件:
address-mapper.xml - 控制器:
AddrController.java
漏洞原因:
与通知列表类似,使用${}进行字符串拼接。
关键代码:
<!-- address-mapper.xml -->
<select id="allDirector" resultType="cn.gson.oasys.model.entity.user.User">
SELECT * FROM aoa_user WHERE pinyin LIKE '${pinyin}%'
</select>
控制器调用:
// AddrController.java
@RequestMapping("/outaddress")
public String outAddress(@RequestParam(value="baseKey",required=false)String baseKey, ...) {
// ...
List<User> users = addressMapper.allDirector(baseKey);
// ...
}
2. 存储型XSS漏洞
2.1 部门管理XSS
漏洞位置:
- 功能点:部门管理->添加部门
- 控制器:相关部门管理控制器
漏洞原因:
用户输入未经过滤直接存入数据库。
漏洞验证:
在添加部门时,部门名称输入:
<script>alert(1)</script>
2.2 用户管理XSS
漏洞位置:
- 功能点:用户管理->编辑用户
- 控制器:相关用户管理控制器
漏洞原因:
用户输入未经过滤直接存入数据库。
2.3 笔记功能XSS
漏洞位置:
- 功能点:笔记功能->写笔记
- 控制器:相关笔记控制器
漏洞验证:
在笔记标题处输入XSS payload:
2.4 文件管理XSS
漏洞位置:
- 功能点:文件管理->新建文件夹
- 控制器:相关文件管理控制器
漏洞验证:
在新建文件夹时,文件夹名输入:
3. 越权漏洞
3.1 流程查看越权
漏洞位置:
- 功能点:流程管理->我的申请->查看流程
- 控制器:相关流程控制器
漏洞原因:
仅检查当前用户是否为申请人或审批人,未对其他用户访问进行限制。
关键代码:
// 获取当前用户
User user = userDao.findOne(userId);
// 获取流程对象
ProcessList process = plDao.findOne(proId);
// 仅检查是否为申请人或审批人
if(process.getUserId().equals(user.getUserId()) ||
process.getProcessUser().equals(user.getUserId())) {
// 允许访问
}
漏洞验证:
- 使用低权限账号登录
- 直接访问查看流程接口枚举流程ID
- 可查看不属于该用户的流程信息
3.2 越权删除
漏洞位置:
- 功能点:日程管理->删除日程
- 控制器:
DaymanageController.java
漏洞原因:
删除操作前仅检查日程ID是否存在,未验证用户权限。
关键代码:
// DaymanageController.java
@RequestMapping("/dayremove")
public String test(@RequestParam("rcid") Long rcid) {
Daymanage rc = daydao.findOne(rcid);
daydao.delete(rc);
return "redirect:/daymanagecalendar";
}
4. 任意文件读取漏洞
漏洞位置:
- 控制器:
UserpanelController.java和ProcedureController.java
漏洞原因:
未对文件路径进行安全校验,允许目录穿越。
关键代码:
// UserpanelController.java
@RequestMapping(value="/image/**",method=RequestMethod.GET)
public void image(HttpServletRequest request, HttpServletResponse response) {
String uri = request.getRequestURI();
uri = uri.replace("/image", "");
File file = new File(rootpath + uri);
// 直接读取文件并返回
}
漏洞验证:
构造包含../的路径读取系统文件:
http://localhost:8089/image/../../../../etc/passwd
5. CSRF漏洞
漏洞位置:
- 功能点:用户面板->写便签
- 控制器:相关便签控制器
漏洞原因:
未使用CSRF Token等防护措施。
关键代码:
@RequestMapping("/savenote")
public String saveNote(Notepaper npaper,
@SessionAttribute("userId") Long userId,
@RequestParam(value="concent",required=false) String concent) {
// 直接处理请求,无CSRF防护
User user = udao.findOne(userId);
npaper.setCreateTime(new Date());
npaper.setUserId(user);
if(npaper.getTitle()==null||"".equals(npaper.getTitle())){
npaper.setTitle("无标题");
}
if(concent!=null&&!"".equals(concent)){
npaper.setConcent(concent);
}
ndao.save(npaper);
return "redirect:/userpanel";
}
漏洞验证:
- 构造恶意页面包含自动提交表单
- 诱骗已登录用户访问
- 可自动创建便签
修复建议
1. SQL注入修复
- 将MyBatis中的
${}替换为#{}预编译方式 - 对用户输入进行严格过滤和转义
2. XSS漏洞修复
- 对所有用户输入进行HTML实体编码
- 使用XSS过滤器或框架提供的防护机制
- 设置HttpOnly标志的Cookie
3. 越权漏洞修复
- 实施严格的权限验证
- 遵循最小权限原则
- 对每个操作进行用户权限校验
4. 任意文件读取修复
- 规范化文件路径
- 检查路径是否在允许范围内
- 禁止目录穿越字符
5. CSRF漏洞修复
- 添加CSRF Token机制
- 检查Referer头
- 使用SameSite Cookie属性
总结
本OA系统存在多处高危安全漏洞,包括SQL注入、XSS、越权访问、任意文件读取和CSRF等。这些漏洞可能导致数据泄露、权限提升和系统被控制等严重后果。建议开发团队按照修复建议进行全面安全加固,并在开发过程中引入安全编码规范和安全测试流程。