某开源ERP最新版SQL与RCE的审计过程
字数 1381 2025-08-10 00:24:01

华夏ERP v2.3.1安全漏洞审计报告

一、系统概述

目标系统:华夏ERP (JSH_ERP) v2.3.1
源码地址:https://gitee.com/jishenghua/JSH_ERP
审计重点:认证绕过、SQL注入、远程代码执行(RCE)

二、认证绕过漏洞分析

漏洞位置

LogCostFilter过滤器类,负责系统访问控制

漏洞原理

  1. 认证检查机制

    • 通过检查session中的user属性判断用户是否登录
    • 对特定路径(/doc.html, /register.html, /login.html)直接放行
  2. 漏洞成因

    • 使用contains()方法进行路径匹配而非精确匹配
    • 攻击者可构造包含login.html的路径绕过认证

漏洞复现

请求示例

GET /depotHead/login.html/../list?search=aaa&currentPage=1&pageSize=10&t=1618229175662 HTTP/1.1
Host: 192.168.245.1:9978

修复建议

  • 使用精确路径匹配而非contains()
  • 实现严格的路径规范化处理

三、SQL注入漏洞分析

漏洞位置

depotHead/list接口的getDepotHeadList方法

漏洞原理

  1. 注入点

    • search参数中的subType字段
    • 通过MyBatis的$符号直接拼接SQL
  2. MyBatis配置

    <!-- 漏洞代码示例 -->
    <select id="selectByConditionDepotHead" resultMap="BaseResultMap">
      SELECT ... WHERE dh.sub_type = ${subType}
    </select>
    

漏洞复现

Payload示例

{
  "type":"其它",
  "subType":"采购订单' or ''='",
  "roleType":"全部数据",
  "materialParam":"22222222222222"
}

最终执行的SQL

SELECT ... WHERE dh.type = '其它' AND dh.sub_type = '采购订单' OR '' = '' ...

修复建议

  • 使用MyBatis的#预编译参数
  • 对用户输入进行严格过滤和转义

四、远程代码执行(RCE)漏洞分析

漏洞位置

/uploadInstallPluginJar接口

漏洞原理

  1. 功能设计

    • 允许上传并动态加载插件JAR文件
    • 插件框架:springboot-plugin-framework
  2. 攻击方式

    • 构造恶意插件JAR
    • DefinPlugin类中植入恶意代码
    • 通过上传接口安装插件

漏洞复现步骤

  1. 创建恶意插件项目
  2. 修改MANIFEST.MF添加必要字段
  3. 打包为JAR文件
  4. 通过接口上传:
    POST /uploadInstallPluginJar
    Content-Type: multipart/form-data
    

限制条件

  • 需要plugins目录存在(需手动创建或已有插件)

修复建议

  • 移除生产环境中的插件安装功能
  • 实现严格的插件签名验证机制
  • 限制插件上传权限

五、审计方法论总结

  1. 入口点定位

    • 检查Filter配置(@WebFilter)
    • 分析Controller映射(@RequestMapping)
  2. 数据流跟踪

    • 从用户输入到SQL执行
    • 从文件上传到代码执行
  3. 关键检查点

    • 认证检查逻辑
    • SQL拼接方式($ vs #)
    • 文件上传处理流程
  4. 辅助工具

    • MyBatis日志配置:
      logging.level.com.jsh.erp.datasource.mappers.*=debug
      
    • IDE插件:MyBatisCodeHelper-Pro

六、完整修复方案

  1. 认证层

    • 实现严格的路径规范化
    • 使用白名单而非contains检查
  2. SQL注入防护

    • 全面替换$#
    • 实现输入参数过滤
  3. RCE防护

    • 禁用生产环境插件上传
    • 实现管理员二次确认机制
    • 添加文件签名验证
  4. 其他建议

    • 定期安全审计
    • 建立安全开发规范
    • 引入安全测试流程

附录:参考链接

  1. 源码仓库:https://gitee.com/jishenghua/JSH_ERP
  2. 插件框架:https://gitee.com/starblues/springboot-plugin-framework-parent
  3. MyBatis安全:https://mybatis.org/mybatis-3/
华夏ERP v2.3.1安全漏洞审计报告 一、系统概述 目标系统 :华夏ERP (JSH_ ERP) v2.3.1 源码地址 :https://gitee.com/jishenghua/JSH_ ERP 审计重点 :认证绕过、SQL注入、远程代码执行(RCE) 二、认证绕过漏洞分析 漏洞位置 LogCostFilter 过滤器类,负责系统访问控制 漏洞原理 认证检查机制 : 通过检查session中的 user 属性判断用户是否登录 对特定路径( /doc.html , /register.html , /login.html )直接放行 漏洞成因 : 使用 contains() 方法进行路径匹配而非精确匹配 攻击者可构造包含 login.html 的路径绕过认证 漏洞复现 请求示例 : 修复建议 使用精确路径匹配而非 contains() 实现严格的路径规范化处理 三、SQL注入漏洞分析 漏洞位置 depotHead/list 接口的 getDepotHeadList 方法 漏洞原理 注入点 : search 参数中的 subType 字段 通过MyBatis的 $ 符号直接拼接SQL MyBatis配置 : 漏洞复现 Payload示例 : 最终执行的SQL : 修复建议 使用MyBatis的 # 预编译参数 对用户输入进行严格过滤和转义 四、远程代码执行(RCE)漏洞分析 漏洞位置 /uploadInstallPluginJar 接口 漏洞原理 功能设计 : 允许上传并动态加载插件JAR文件 插件框架:springboot-plugin-framework 攻击方式 : 构造恶意插件JAR 在 DefinPlugin 类中植入恶意代码 通过上传接口安装插件 漏洞复现步骤 创建恶意插件项目 修改MANIFEST.MF添加必要字段 打包为JAR文件 通过接口上传: 限制条件 需要 plugins 目录存在(需手动创建或已有插件) 修复建议 移除生产环境中的插件安装功能 实现严格的插件签名验证机制 限制插件上传权限 五、审计方法论总结 入口点定位 : 检查Filter配置( @WebFilter ) 分析Controller映射( @RequestMapping ) 数据流跟踪 : 从用户输入到SQL执行 从文件上传到代码执行 关键检查点 : 认证检查逻辑 SQL拼接方式( $ vs # ) 文件上传处理流程 辅助工具 : MyBatis日志配置: IDE插件:MyBatisCodeHelper-Pro 六、完整修复方案 认证层 : 实现严格的路径规范化 使用白名单而非contains检查 SQL注入防护 : 全面替换 $ 为 # 实现输入参数过滤 RCE防护 : 禁用生产环境插件上传 实现管理员二次确认机制 添加文件签名验证 其他建议 : 定期安全审计 建立安全开发规范 引入安全测试流程 附录:参考链接 源码仓库:https://gitee.com/jishenghua/JSH_ ERP 插件框架:https://gitee.com/starblues/springboot-plugin-framework-parent MyBatis安全:https://mybatis.org/mybatis-3/