一次简单的Java代码审计
字数 1499 2025-08-07 08:21:57

Java代码审计实战:Jeecg框架安全漏洞分析

环境准备

  1. 源码获取

    • 旧版本源码:https://gitee.com/jeecg/jeecg
    • 新版本源码:https://gitee.com/jeecg/jeecg-boot
  2. 开发环境

    • 使用IDEA开发工具
    • 配置Tomcat Server -> Local
    • 部署模式选择"war exploded"(支持热部署)
  3. 数据库初始化

    • 使用MySQL数据库
    • 导入jeecg_4.0_mysql.sql文件

框架基本信息

Springframework配置

  1. MultipartFile处理

    • 使用Springframework 4.0.9版本
    • 手动配置了CommonsMultipartResolver
    • 安全风险:Springframework < 4.1.8在Windows下存在目录穿越漏洞
  2. 路由配置

    • 两种路由模式:
      • .do结尾的请求
      • /rest/开头的请求

安全过滤器分析

  1. Filter收集

    • 未发现专门的权限认证Filter
  2. 拦截器分析

    • 三个拦截器均映射到/**
      • EncodingInterceptor:仅处理简单编码
      • RestAuthTokenInterceptor:存在绕过风险
      • AuthInterceptor:不过滤包含rest/的请求,存在绕过风险

漏洞分析

1. 权限认证绕过漏洞

漏洞1:路径遍历绕过

  • 原理:通过/api/../路径可以绕过AuthInterceptor的认证
  • 验证
    • 正常访问会302跳转到超时页面
    • 使用/api/../可绕过认证

漏洞2:JWT Token绕过

  • 原理
    • RestAuthTokenInterceptor使用固定JWT密钥
    • Redis中存储的Token信息基本固定(除时间外)
    • 可爆破Token
  • 关键代码
    // 固定密钥
    org.jeecgframework.jwt.def.JwtConstants#JWT_SECRET
    
    // Token创建
    org.jeecgframework.jwt.service.RedisTokenManager#createToken
    
  • 利用步骤
    1. 正常登录获取Token样本
    2. 在JWT官网解密获取结构
    3. 修改时间戳进行爆破(需考虑Token校验机制)

2. 任意文件上传漏洞(GetShell)

  • 漏洞点iconController?saveOrUpdateIcon
  • 特点
    • 无任何过滤/限制
    • 不重命名上传文件
  • 利用:直接上传Webshell获取服务器权限

3. 组件使用/修复不当漏洞

Xstream漏洞

  • 位置CgformSqlController#doMigrateIn
  • 风险
    • 文件上传后使用Xstream解析
    • 可能导致反序列化漏洞
    • 同时存在XXE漏洞风险

SAXReader漏洞

  • 风险
    • 文件上传后使用SAXReader解析
    • 存在XXE漏洞风险

Springframework MultipartFile目录穿越

  • 影响版本:< 4.1.8
  • 风险:Windows系统下存在目录穿越漏洞
  • 相关方法
    org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename
    

修复建议

  1. 权限认证

    • 统一认证逻辑,避免路径遍历绕过
    • 使用动态JWT密钥,增加爆破难度
    • 加强Token校验机制
  2. 文件上传

    • 实施严格的文件类型检查
    • 强制重命名上传文件
    • 限制上传目录权限
  3. 组件升级

    • 升级Springframework至4.1.8+版本
    • 安全配置Xstream和SAXReader
    • 禁用XXE外部实体解析
  4. 其他

    • 实施输入验证和输出编码
    • 加强错误处理,避免信息泄露
    • 定期安全审计和代码复查

参考资源

  1. Spring MultipartFile文件上传的潜在威胁
  2. JWT安全最佳实践
  3. Xstream安全配置指南

通过本次审计,我们发现Jeecg框架存在多处严重安全漏洞,建议开发者及时修复并加强安全防护措施。

Java代码审计实战:Jeecg框架安全漏洞分析 环境准备 源码获取 : 旧版本源码:https://gitee.com/jeecg/jeecg 新版本源码:https://gitee.com/jeecg/jeecg-boot 开发环境 : 使用IDEA开发工具 配置Tomcat Server -> Local 部署模式选择"war exploded"(支持热部署) 数据库初始化 : 使用MySQL数据库 导入 jeecg_4.0_mysql.sql 文件 框架基本信息 Springframework配置 MultipartFile处理 : 使用Springframework 4.0.9版本 手动配置了 CommonsMultipartResolver 安全风险 :Springframework < 4.1.8在Windows下存在目录穿越漏洞 路由配置 : 两种路由模式: .do 结尾的请求 /rest/ 开头的请求 安全过滤器分析 Filter收集 : 未发现专门的权限认证Filter 拦截器分析 : 三个拦截器均映射到 /** : EncodingInterceptor :仅处理简单编码 RestAuthTokenInterceptor :存在绕过风险 AuthInterceptor :不过滤包含 rest/ 的请求,存在绕过风险 漏洞分析 1. 权限认证绕过漏洞 漏洞1:路径遍历绕过 原理 :通过 /api/../ 路径可以绕过 AuthInterceptor 的认证 验证 : 正常访问会302跳转到超时页面 使用 /api/../ 可绕过认证 漏洞2:JWT Token绕过 原理 : RestAuthTokenInterceptor 使用固定JWT密钥 Redis中存储的Token信息基本固定(除时间外) 可爆破Token 关键代码 : 利用步骤 : 正常登录获取Token样本 在JWT官网解密获取结构 修改时间戳进行爆破(需考虑Token校验机制) 2. 任意文件上传漏洞(GetShell) 漏洞点 : iconController?saveOrUpdateIcon 特点 : 无任何过滤/限制 不重命名上传文件 利用 :直接上传Webshell获取服务器权限 3. 组件使用/修复不当漏洞 Xstream漏洞 位置 : CgformSqlController#doMigrateIn 风险 : 文件上传后使用Xstream解析 可能导致反序列化漏洞 同时存在XXE漏洞风险 SAXReader漏洞 风险 : 文件上传后使用SAXReader解析 存在XXE漏洞风险 Springframework MultipartFile目录穿越 影响版本 : < 4.1.8 风险 :Windows系统下存在目录穿越漏洞 相关方法 : 修复建议 权限认证 : 统一认证逻辑,避免路径遍历绕过 使用动态JWT密钥,增加爆破难度 加强Token校验机制 文件上传 : 实施严格的文件类型检查 强制重命名上传文件 限制上传目录权限 组件升级 : 升级Springframework至4.1.8+版本 安全配置Xstream和SAXReader 禁用XXE外部实体解析 其他 : 实施输入验证和输出编码 加强错误处理,避免信息泄露 定期安全审计和代码复查 参考资源 Spring MultipartFile文件上传的潜在威胁 JWT安全最佳实践 Xstream安全配置指南 通过本次审计,我们发现Jeecg框架存在多处严重安全漏洞,建议开发者及时修复并加强安全防护措施。