一次简单的Java代码审计
字数 1499 2025-08-07 08:21:57
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
- 关键代码:
// 固定密钥 org.jeecgframework.jwt.def.JwtConstants#JWT_SECRET // Token创建 org.jeecgframework.jwt.service.RedisTokenManager#createToken - 利用步骤:
- 正常登录获取Token样本
- 在JWT官网解密获取结构
- 修改时间戳进行爆破(需考虑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
修复建议
-
权限认证:
- 统一认证逻辑,避免路径遍历绕过
- 使用动态JWT密钥,增加爆破难度
- 加强Token校验机制
-
文件上传:
- 实施严格的文件类型检查
- 强制重命名上传文件
- 限制上传目录权限
-
组件升级:
- 升级Springframework至4.1.8+版本
- 安全配置Xstream和SAXReader
- 禁用XXE外部实体解析
-
其他:
- 实施输入验证和输出编码
- 加强错误处理,避免信息泄露
- 定期安全审计和代码复查
参考资源
通过本次审计,我们发现Jeecg框架存在多处严重安全漏洞,建议开发者及时修复并加强安全防护措施。