java代码审计之某办公oa
字数 1752 2025-08-25 22:58:20

OA办公自动化系统安全审计报告

项目概述

OASYS是一个基于SpringBoot框架开发的OA办公自动化系统,主要技术栈包括:

  • 项目管理:Maven
  • 数据库:MySQL
  • 前端框架:Freemarker模板引擎 + Bootstrap
  • 持久层:集成JPA和Mybatis

环境搭建

  1. 创建MySQL数据库oasys
  2. 导入oasys.sql文件初始化数据库结构
  3. 修改application.properties配置文件中的数据库连接信息
  4. 启动项目

漏洞分析

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())) {
    // 允许访问
}

漏洞验证

  1. 使用低权限账号登录
  2. 直接访问查看流程接口枚举流程ID
  3. 可查看不属于该用户的流程信息

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.javaProcedureController.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. 构造恶意页面包含自动提交表单
  2. 诱骗已登录用户访问
  3. 可自动创建便签

修复建议

1. SQL注入修复

  • 将MyBatis中的${}替换为#{}预编译方式
  • 对用户输入进行严格过滤和转义

2. XSS漏洞修复

  • 对所有用户输入进行HTML实体编码
  • 使用XSS过滤器或框架提供的防护机制
  • 设置HttpOnly标志的Cookie

3. 越权漏洞修复

  • 实施严格的权限验证
  • 遵循最小权限原则
  • 对每个操作进行用户权限校验

4. 任意文件读取修复

  • 规范化文件路径
  • 检查路径是否在允许范围内
  • 禁止目录穿越字符

5. CSRF漏洞修复

  • 添加CSRF Token机制
  • 检查Referer头
  • 使用SameSite Cookie属性

总结

本OA系统存在多处高危安全漏洞,包括SQL注入、XSS、越权访问、任意文件读取和CSRF等。这些漏洞可能导致数据泄露、权限提升和系统被控制等严重后果。建议开发团队按照修复建议进行全面安全加固,并在开发过程中引入安全编码规范和安全测试流程。

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注入风险。 关键代码 : 控制器调用 : 漏洞验证 : 报错注入Payload: 时间盲注Payload: 1.2 通讯录SQL注入 漏洞位置 : 映射文件: address-mapper.xml 控制器: AddrController.java 漏洞原因 : 与通知列表类似,使用 ${} 进行字符串拼接。 关键代码 : 控制器调用 : 2. 存储型XSS漏洞 2.1 部门管理XSS 漏洞位置 : 功能点:部门管理->添加部门 控制器:相关部门管理控制器 漏洞原因 : 用户输入未经过滤直接存入数据库。 漏洞验证 : 在添加部门时,部门名称输入: 2.2 用户管理XSS 漏洞位置 : 功能点:用户管理->编辑用户 控制器:相关用户管理控制器 漏洞原因 : 用户输入未经过滤直接存入数据库。 2.3 笔记功能XSS 漏洞位置 : 功能点:笔记功能->写笔记 控制器:相关笔记控制器 漏洞验证 : 在笔记标题处输入XSS payload: 2.4 文件管理XSS 漏洞位置 : 功能点:文件管理->新建文件夹 控制器:相关文件管理控制器 漏洞验证 : 在新建文件夹时,文件夹名输入: 3. 越权漏洞 3.1 流程查看越权 漏洞位置 : 功能点:流程管理->我的申请->查看流程 控制器:相关流程控制器 漏洞原因 : 仅检查当前用户是否为申请人或审批人,未对其他用户访问进行限制。 关键代码 : 漏洞验证 : 使用低权限账号登录 直接访问查看流程接口枚举流程ID 可查看不属于该用户的流程信息 3.2 越权删除 漏洞位置 : 功能点:日程管理->删除日程 控制器: DaymanageController.java 漏洞原因 : 删除操作前仅检查日程ID是否存在,未验证用户权限。 关键代码 : 4. 任意文件读取漏洞 漏洞位置 : 控制器: UserpanelController.java 和 ProcedureController.java 漏洞原因 : 未对文件路径进行安全校验,允许目录穿越。 关键代码 : 漏洞验证 : 构造包含 ../ 的路径读取系统文件: 5. CSRF漏洞 漏洞位置 : 功能点:用户面板->写便签 控制器:相关便签控制器 漏洞原因 : 未使用CSRF Token等防护措施。 关键代码 : 漏洞验证 : 构造恶意页面包含自动提交表单 诱骗已登录用户访问 可自动创建便签 修复建议 1. SQL注入修复 将MyBatis中的 ${} 替换为 #{} 预编译方式 对用户输入进行严格过滤和转义 2. XSS漏洞修复 对所有用户输入进行HTML实体编码 使用XSS过滤器或框架提供的防护机制 设置HttpOnly标志的Cookie 3. 越权漏洞修复 实施严格的权限验证 遵循最小权限原则 对每个操作进行用户权限校验 4. 任意文件读取修复 规范化文件路径 检查路径是否在允许范围内 禁止目录穿越字符 5. CSRF漏洞修复 添加CSRF Token机制 检查Referer头 使用SameSite Cookie属性 总结 本OA系统存在多处高危安全漏洞,包括SQL注入、XSS、越权访问、任意文件读取和CSRF等。这些漏洞可能导致数据泄露、权限提升和系统被控制等严重后果。建议开发团队按照修复建议进行全面安全加固,并在开发过程中引入安全编码规范和安全测试流程。