代码审计-jshERP-3.5
字数 2177 2025-09-01 11:25:54

jshERP v3.5 代码审计与漏洞分析教学文档

目录

  1. 环境搭建
  2. 项目架构分析
  3. 漏洞审计方法论
  4. 详细漏洞分析
    • 登录绕过漏洞
    • 水平越权漏洞
    • 文件上传漏洞
    • Swagger API未授权访问
  5. 修复建议
  6. 总结

1. 环境搭建

1.1 准备工作

  • 项目源码:GitHub Release 管伊佳ERP_v3.5
  • 数据库:MySQL
  • 缓存:Redis
  • 前端:Node.js环境

1.2 后端配置

  1. 修改application.properties中的MySQL和Redis配置
  2. 导入SQL文件初始化数据库
  3. 启动Spring Boot应用

1.3 前端配置

  1. 安装Node.js环境
  2. 解决依赖冲突:
    • package.json中添加resolutions字段强制指定webpack版本
    • 降低css-loaderstyle-loader版本以兼容Webpack 4
  3. 运行npm run serve启动前端

2. 项目架构分析

2.1 技术栈

  • 后端:Spring Boot + MyBatis
  • 前端:Vue.js
  • 数据库:MySQL
  • 缓存:Redis
  • JSON处理:FastJSON 1.2.83(存在已知漏洞)

2.2 关键组件

  • TenantConfig:租户隔离配置
  • Filter:登录验证过滤器
  • Swagger2Config:API文档配置

3. 漏洞审计方法论

3.1 审计流程

  1. 分析pom.xml识别依赖风险
  2. 审查过滤器(Filter)和拦截器(Interceptor)
  3. 检查租户隔离实现
  4. 测试关键功能点(用户管理、角色管理等)
  5. 检查文件上传功能
  6. 验证API文档安全性

3.2 重点关注点

  • MyBatis SQL注入风险(${}使用)
  • FastJSON反序列化漏洞
  • 权限校验缺失
  • 租户隔离绕过
  • 文件上传限制

4. 详细漏洞分析

4.1 登录绕过漏洞

漏洞位置

Filter中的doFilter方法

漏洞原理

  1. 过滤器检查请求路径是否包含allowUrls中的路径
  2. 使用contains方法而非精确匹配
  3. 可通过路径遍历绕过:/jshERP-boot/user/login/../../xx

复现步骤

  1. 构造包含允许路径的URL
  2. 发送未授权请求

影响

  • 绕过登录验证
  • 访问受限功能

4.2 水平越权漏洞

4.2.1 租户隔离绕过

漏洞位置

TenantConfig租户配置

漏洞原理
  1. 系统从X-Access-Token头获取租户ID
  2. 修改或删除该头部可绕过租户隔离
  3. 配合登录绕过实现完全越权
复现步骤
  1. 删除X-Access-Token
  2. 使用路径遍历绕过登录
  3. 发送修改其他租户数据的请求

4.2.2 具体越权点

用户管理
  • UserController.resetPwd:重置任意用户密码
  • UserController.updateByPrimaryKeySelective:修改用户信息
供应商管理
  • SupplierController.batchSetStatus:修改任意供应商状态
资源管理
  • ResourceController.updateResource:修改资源并转移租户
  • ResourceController.delete:删除任意资源
角色管理
  • RoleController.allList:获取所有角色信息
  • RoleController.batchSetStatus:修改任意角色状态
其他
  • PersonController.getAllList:获取所有经手人信息
  • AccountController.getAccount:未授权访问账户信息

影响

  • 查看、修改、删除其他租户数据
  • 系统数据泄露
  • 权限提升

4.3 文件上传漏洞

漏洞位置

SystemConfigController.upload方法

限制条件

  1. biz参数必须为billfinancialmaterial
  2. 默认存储到本地(fileUploadType=1)
  3. 后缀限制:仅允许特定类型(包括PDF)

潜在风险

  • 存储型XSS(通过PDF)
  • 若解压功能存在,可能造成ZIP解压漏洞

4.4 Swagger API未授权访问

漏洞位置

Swagger2Config配置类

漏洞原理

  • 未配置访问控制
  • 未添加身份验证

影响

  • 暴露所有API接口
  • 辅助攻击者发现更多漏洞

5. 修复建议

5.1 登录绕过

  • 使用精确路径匹配而非contains
  • 规范化请求路径后再验证

5.2 水平越权

  1. 租户隔离增强:
    • 强制要求X-Access-Token
    • 添加默认租户限制
  2. 关键操作添加权限验证:
    • 操作前验证用户权限
    • 记录操作日志

5.3 文件上传

  • 限制PDF文件中的JavaScript执行
  • 添加内容类型检查

5.4 Swagger API

  • 添加访问控制
  • 限制内网访问
  • 或生产环境禁用

6. 总结

jshERP v3.5存在多处严重漏洞,主要问题集中在:

  1. 权限验证不严格
  2. 租户隔离可绕过
  3. 敏感接口暴露

审计此类系统时应重点关注:

  • 多租户系统的隔离机制
  • 权限验证的完整性
  • 敏感操作的日志记录
  • 第三方组件的安全性

通过本案例,我们可以学习到企业级应用中常见的权限设计缺陷及其利用方式,为开发安全的系统提供参考。

jshERP v3.5 代码审计与漏洞分析教学文档 目录 环境搭建 项目架构分析 漏洞审计方法论 详细漏洞分析 登录绕过漏洞 水平越权漏洞 文件上传漏洞 Swagger API未授权访问 修复建议 总结 1. 环境搭建 1.1 准备工作 项目源码:GitHub Release 管伊佳ERP_ v3.5 数据库:MySQL 缓存:Redis 前端:Node.js环境 1.2 后端配置 修改 application.properties 中的MySQL和Redis配置 导入SQL文件初始化数据库 启动Spring Boot应用 1.3 前端配置 安装Node.js环境 解决依赖冲突: 在 package.json 中添加 resolutions 字段强制指定webpack版本 降低 css-loader 和 style-loader 版本以兼容Webpack 4 运行 npm run serve 启动前端 2. 项目架构分析 2.1 技术栈 后端:Spring Boot + MyBatis 前端:Vue.js 数据库:MySQL 缓存:Redis JSON处理:FastJSON 1.2.83(存在已知漏洞) 2.2 关键组件 TenantConfig :租户隔离配置 Filter :登录验证过滤器 Swagger2Config :API文档配置 3. 漏洞审计方法论 3.1 审计流程 分析 pom.xml 识别依赖风险 审查过滤器(Filter)和拦截器(Interceptor) 检查租户隔离实现 测试关键功能点(用户管理、角色管理等) 检查文件上传功能 验证API文档安全性 3.2 重点关注点 MyBatis SQL注入风险( ${} 使用) FastJSON反序列化漏洞 权限校验缺失 租户隔离绕过 文件上传限制 4. 详细漏洞分析 4.1 登录绕过漏洞 漏洞位置 Filter 中的 doFilter 方法 漏洞原理 过滤器检查请求路径是否包含 allowUrls 中的路径 使用 contains 方法而非精确匹配 可通过路径遍历绕过: /jshERP-boot/user/login/../../xx 复现步骤 构造包含允许路径的URL 发送未授权请求 影响 绕过登录验证 访问受限功能 4.2 水平越权漏洞 4.2.1 租户隔离绕过 漏洞位置 TenantConfig 租户配置 漏洞原理 系统从 X-Access-Token 头获取租户ID 修改或删除该头部可绕过租户隔离 配合登录绕过实现完全越权 复现步骤 删除 X-Access-Token 头 使用路径遍历绕过登录 发送修改其他租户数据的请求 4.2.2 具体越权点 用户管理 UserController.resetPwd :重置任意用户密码 UserController.updateByPrimaryKeySelective :修改用户信息 供应商管理 SupplierController.batchSetStatus :修改任意供应商状态 资源管理 ResourceController.updateResource :修改资源并转移租户 ResourceController.delete :删除任意资源 角色管理 RoleController.allList :获取所有角色信息 RoleController.batchSetStatus :修改任意角色状态 其他 PersonController.getAllList :获取所有经手人信息 AccountController.getAccount :未授权访问账户信息 影响 查看、修改、删除其他租户数据 系统数据泄露 权限提升 4.3 文件上传漏洞 漏洞位置 SystemConfigController.upload 方法 限制条件 biz 参数必须为 bill 、 financial 或 material 默认存储到本地( fileUploadType=1 ) 后缀限制:仅允许特定类型(包括PDF) 潜在风险 存储型XSS(通过PDF) 若解压功能存在,可能造成ZIP解压漏洞 4.4 Swagger API未授权访问 漏洞位置 Swagger2Config 配置类 漏洞原理 未配置访问控制 未添加身份验证 影响 暴露所有API接口 辅助攻击者发现更多漏洞 5. 修复建议 5.1 登录绕过 使用精确路径匹配而非 contains 规范化请求路径后再验证 5.2 水平越权 租户隔离增强: 强制要求 X-Access-Token 添加默认租户限制 关键操作添加权限验证: 操作前验证用户权限 记录操作日志 5.3 文件上传 限制PDF文件中的JavaScript执行 添加内容类型检查 5.4 Swagger API 添加访问控制 限制内网访问 或生产环境禁用 6. 总结 jshERP v3.5存在多处严重漏洞,主要问题集中在: 权限验证不严格 租户隔离可绕过 敏感接口暴露 审计此类系统时应重点关注: 多租户系统的隔离机制 权限验证的完整性 敏感操作的日志记录 第三方组件的安全性 通过本案例,我们可以学习到企业级应用中常见的权限设计缺陷及其利用方式,为开发安全的系统提供参考。