JAVA代码审计-某依系统
字数 2257 2025-08-06 12:20:51

某依系统Java代码审计与漏洞分析报告

环境搭建

  1. 使用IntelliJ IDEA进行环境搭建
  2. 导入数据库后启动环境
  3. 项目采用Maven多模块构建方式

第三方组件漏洞审计

1. Shiro反序列化漏洞(v4.2)

漏洞位置

  • RuoYi-v4.2\ruoyi-framework\src\main\java\com\ruoyi\framework\config\ShiroConfig.java

关键点

  • 第231-276行配置了资源访问拦截器
  • 第272行使用/**表达式进行路径拦截
  • 密钥硬编码在代码中(通过搜索setCipherKey可发现)

Shiro URL路径表达式组成

  1. 资源定位符(Resource Locator)
  2. 访问控制指令(Action/Permission)
  3. 过滤器链(Filter Chain)

Ant风格路径表达式示例

  • /admin/** - 匹配所有以/admin/开头的URL
  • /user/create - 匹配具体URL路径
  • /login.jsp - 匹配具体JSP路径

漏洞复现

  1. 发现cookie含有rememberme字段
  2. 使用脚本或自动化工具构造恶意payload
  3. 经过序列化、AES加密、base64编码后作为rememberMe字段发送
  4. Shiro解密并反序列化导致RCE

2. Fastjson反序列化漏洞

审计流程

  1. 全局搜索parseObject
  2. 追踪VelocityUtils.java中的JSONObject.parseObject(options)
  3. options来自genTable.getOptions()
  4. 跟进setTreeVelocityContextprepareContext
  5. 发现GenConstants.TPL_TREE常量值为"tree"
  6. tplCategory字段有两个值:"crud"和"tree"

调用链
GenTaleServiceImpl.javaVelocityUtils.prepareContext(table)genTableMapper.selectGenTableById(tableId)

漏洞触发点

  • 路径:/tool/gen/preview
  • 可控参数:tableId

3. SnakeYaml组件漏洞

漏洞信息

  • 漏洞编号:CVE-2022-1471
  • 类型:缓冲区错误导致DoS
  • 官方认为使用场景应仅接收可信数据源,未修复

审计方法

  • 全局搜索Yaml.load(
  • 本项目未使用该组件

4. Thymeleaf组件漏洞(v4.7.1)

漏洞信息

  • 版本:2.0.0
  • 漏洞类型:SSTI(模板注入)
  • 路径遍历漏洞可读取任意文件

审计关注点

  1. URL路径可控
  2. return内容可控

漏洞示例代码

@GetMapping("/view")
@ResponseBody
public String view(@RequestParam(value="name", required=false, defaultValue="../../file.txt") String name) throws IOException {
    // 文件读取逻辑
}

修复建议

  1. 使用Thymeleaf内置安全功能
  2. 使用Spring Security的SpEL处理请求参数
  3. 限制可访问文件夹

v4.7.1漏洞点

  • 文件:CacheController.java
  • 路径:/monitor/cache
  • 接口:/getNames, /getKeys, /getValue
  • 方法:POST
  • 参数:fragment

Payload示例

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("whoami").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch test")}__::.x

复现步骤

  1. 访问系统监控 → 缓存监控
  2. 点击"刷新"按钮捕获请求
  3. fragment参数中构造payload
  4. URL编码后发送

Web漏洞审计

1. SQL注入漏洞

审计方法

  1. 全局搜索$限定文件类型为.xml
  2. 发现sysDeptMapper.xmlsysUserMapper.xml存在风险

调用链
sysRoleMapper.xmlSysRoleMapper.javaSysRoleServiceImpl.javaISysRoleService.javaSysRoleController.java

漏洞复现

  1. 访问角色管理功能
  2. 使用搜索功能捕获/system/role/list请求
  3. 使用sqlmap验证

2. 定时任务功能命令执行漏洞

模块位置

  • ruoyi-quartz模块
  • 使用quartz框架

关键代码

  • SysJobController.java中的run方法
  • 最终实现:SysJobServiceImpl.java第180-188行
  • JobInvokeUtil.invokeMethod(sysJob)

执行方式

  1. Bean调用
  2. Class类调用

漏洞复现

  1. 添加定时任务
  2. 输入恶意payload
  3. 执行任务观察DNSlog回显

3. 任意文件读取/下载漏洞

漏洞位置

  • CommonController.java第96-111行
  • 方法:resourceDownload

关键点

  1. 使用FileUtils.writeBytes()输出文件
  2. downloadPathlocalPath和资源路径组成
  3. localPath来自application.yml配置文件

漏洞接口

  • 路径:/common/download/resource
  • 方法:GET
  • 参数:resource

Payload示例

http://127.0.0.1/common/download/resource?resource=/profile/etc/passwd

参考资源

  1. Shiro反序列化漏洞分析
  2. Fastjson漏洞利用
  3. Thymeleaf SSTI漏洞分析
某依系统Java代码审计与漏洞分析报告 环境搭建 使用IntelliJ IDEA进行环境搭建 导入数据库后启动环境 项目采用Maven多模块构建方式 第三方组件漏洞审计 1. Shiro反序列化漏洞(v4.2) 漏洞位置 : RuoYi-v4.2\ruoyi-framework\src\main\java\com\ruoyi\framework\config\ShiroConfig.java 关键点 : 第231-276行配置了资源访问拦截器 第272行使用 /** 表达式进行路径拦截 密钥硬编码在代码中(通过搜索 setCipherKey 可发现) Shiro URL路径表达式组成 : 资源定位符(Resource Locator) 访问控制指令(Action/Permission) 过滤器链(Filter Chain) Ant风格路径表达式示例 : /admin/** - 匹配所有以 /admin/ 开头的URL /user/create - 匹配具体URL路径 /login.jsp - 匹配具体JSP路径 漏洞复现 : 发现cookie含有rememberme字段 使用脚本或自动化工具构造恶意payload 经过序列化、AES加密、base64编码后作为rememberMe字段发送 Shiro解密并反序列化导致RCE 2. Fastjson反序列化漏洞 审计流程 : 全局搜索 parseObject 追踪 VelocityUtils.java 中的 JSONObject.parseObject(options) options 来自 genTable.getOptions() 跟进 setTreeVelocityContext 和 prepareContext 发现 GenConstants.TPL_TREE 常量值为"tree" tplCategory 字段有两个值:"crud"和"tree" 调用链 : GenTaleServiceImpl.java → VelocityUtils.prepareContext(table) → genTableMapper.selectGenTableById(tableId) 漏洞触发点 : 路径: /tool/gen/preview 可控参数: tableId 3. SnakeYaml组件漏洞 漏洞信息 : 漏洞编号:CVE-2022-1471 类型:缓冲区错误导致DoS 官方认为使用场景应仅接收可信数据源,未修复 审计方法 : 全局搜索 Yaml.load( 本项目未使用该组件 4. Thymeleaf组件漏洞(v4.7.1) 漏洞信息 : 版本:2.0.0 漏洞类型:SSTI(模板注入) 路径遍历漏洞可读取任意文件 审计关注点 : URL路径可控 return内容可控 漏洞示例代码 : 修复建议 : 使用Thymeleaf内置安全功能 使用Spring Security的SpEL处理请求参数 限制可访问文件夹 v4.7.1漏洞点 : 文件: CacheController.java 路径: /monitor/cache 接口: /getNames , /getKeys , /getValue 方法:POST 参数: fragment Payload示例 : 复现步骤 : 访问系统监控 → 缓存监控 点击"刷新"按钮捕获请求 在 fragment 参数中构造payload URL编码后发送 Web漏洞审计 1. SQL注入漏洞 审计方法 : 全局搜索 $ 限定文件类型为 .xml 发现 sysDeptMapper.xml 和 sysUserMapper.xml 存在风险 调用链 : sysRoleMapper.xml → SysRoleMapper.java → SysRoleServiceImpl.java → ISysRoleService.java → SysRoleController.java 漏洞复现 : 访问角色管理功能 使用搜索功能捕获 /system/role/list 请求 使用sqlmap验证 2. 定时任务功能命令执行漏洞 模块位置 : ruoyi-quartz 模块 使用quartz框架 关键代码 : SysJobController.java 中的 run 方法 最终实现: SysJobServiceImpl.java 第180-188行 JobInvokeUtil.invokeMethod(sysJob) 执行方式 : Bean调用 Class类调用 漏洞复现 : 添加定时任务 输入恶意payload 执行任务观察DNSlog回显 3. 任意文件读取/下载漏洞 漏洞位置 : CommonController.java 第96-111行 方法: resourceDownload 关键点 : 使用 FileUtils.writeBytes() 输出文件 downloadPath 由 localPath 和资源路径组成 localPath 来自 application.yml 配置文件 漏洞接口 : 路径: /common/download/resource 方法:GET 参数: resource Payload示例 : 参考资源 Shiro反序列化漏洞分析 Fastjson漏洞利用 Thymeleaf SSTI漏洞分析