代码审计 | JFinal CMS系统存在文件读取漏洞
字数 992 2025-08-22 12:23:42
JFinal CMS系统文件读取漏洞分析与复现
一、漏洞概述
JFinal CMS是一款基于JAVA开发的开源企业网站管理系统,具有动态添加字段、自定义标签、多站点功能等特点。在系统模板管理功能中存在文件读取漏洞,攻击者可以通过构造特殊请求读取服务器上的任意文件内容。
二、环境搭建
- 下载源码:从官方渠道获取JFinal CMS源码
- 导入项目:使用IDEA等Java IDE导入项目
- 数据库配置:
- 创建相应数据库
- 修改项目中的数据库连接配置
- 启动环境:配置完成后启动系统
- 后台登录:使用管理员账号登录后台管理系统
三、漏洞分析
漏洞位置
漏洞存在于系统管理→模板管理→编辑功能模块中
关键代码分析
- 文件名检查:
if (StringUtils.isBlank(fileName)) {
render(CommonAttribute.ADMIN_ERROR_VIEW);
return;
}
- 检查fileName参数是否为空
- 如果为空则返回错误页面
- 文件路径构造:
String filePath = "";
if(StringUtils.isNotBlank(directory)){
filePath = "/"+directory.replaceAll(",", "/")+"/"+fileName;
}else{
filePath = "/"+fileName;
}
- 当directory参数不为空时,将逗号替换为斜杠构造路径
- 当directory为空时,直接使用fileName作为路径
- 文件内容读取:
setAttr("content", StringEscapeUtils.escapeHtml(TemplateUtils.read(filePath)));
- 使用TemplateUtils.read方法读取指定路径文件内容
- 对内容进行HTML转义后设置为content属性
漏洞成因
- 未对fileName参数进行有效过滤和限制
- 当directory为空时,可直接通过fileName参数构造任意文件路径
- 文件读取功能未做权限校验和路径限制
四、漏洞验证
测试环境准备
- 在Windows系统G盘根目录创建测试文件1.txt
- 文件内容可设置为"test file content"
漏洞利用步骤
- 使用Burp Suite等工具拦截模板编辑请求
- 修改请求参数,构造恶意fileName值
- 发送请求验证文件读取结果
示例请求
POST /admin/template/edit HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
fileName=G:/1.txt&directory=
预期结果
- 成功读取G:/1.txt文件内容
- 响应中包含文件内容"test file content"
五、修复建议
-
输入验证:
- 对fileName参数进行严格过滤
- 限制文件路径只能访问特定目录
-
权限控制:
- 增加文件读取权限校验
- 确保只有授权用户可以访问文件
-
路径限制:
- 使用固定前缀限制文件读取范围
- 禁止访问系统关键目录
-
代码修改示例:
// 定义允许访问的模板目录
String TEMPLATE_BASE_DIR = "/templates/";
// 修改文件路径构造逻辑
String filePath = TEMPLATE_BASE_DIR + fileName;
if (!filePath.startsWith(TEMPLATE_BASE_DIR)) {
render(CommonAttribute.ADMIN_ERROR_VIEW);
return;
}
六、总结
JFinal CMS的模板管理功能由于缺乏对文件路径的有效限制,导致攻击者可以构造恶意路径读取服务器上的任意文件。该漏洞可能泄露敏感信息,如配置文件、数据库凭证等。开发人员应重视文件操作的安全性,实施严格的输入验证和访问控制。