代码审计 | JFinal CMS系统存在文件读取漏洞
字数 992 2025-08-22 12:23:42

JFinal CMS系统文件读取漏洞分析与复现

一、漏洞概述

JFinal CMS是一款基于JAVA开发的开源企业网站管理系统,具有动态添加字段、自定义标签、多站点功能等特点。在系统模板管理功能中存在文件读取漏洞,攻击者可以通过构造特殊请求读取服务器上的任意文件内容。

二、环境搭建

  1. 下载源码:从官方渠道获取JFinal CMS源码
  2. 导入项目:使用IDEA等Java IDE导入项目
  3. 数据库配置
    • 创建相应数据库
    • 修改项目中的数据库连接配置
  4. 启动环境:配置完成后启动系统
  5. 后台登录:使用管理员账号登录后台管理系统

三、漏洞分析

漏洞位置

漏洞存在于系统管理→模板管理→编辑功能模块中

关键代码分析

  1. 文件名检查
if (StringUtils.isBlank(fileName)) {
    render(CommonAttribute.ADMIN_ERROR_VIEW);
    return;
}
  • 检查fileName参数是否为空
  • 如果为空则返回错误页面
  1. 文件路径构造
String filePath = "";
if(StringUtils.isNotBlank(directory)){
    filePath = "/"+directory.replaceAll(",", "/")+"/"+fileName;
}else{
    filePath = "/"+fileName;
}
  • 当directory参数不为空时,将逗号替换为斜杠构造路径
  • 当directory为空时,直接使用fileName作为路径
  1. 文件内容读取
setAttr("content", StringEscapeUtils.escapeHtml(TemplateUtils.read(filePath)));
  • 使用TemplateUtils.read方法读取指定路径文件内容
  • 对内容进行HTML转义后设置为content属性

漏洞成因

  • 未对fileName参数进行有效过滤和限制
  • 当directory为空时,可直接通过fileName参数构造任意文件路径
  • 文件读取功能未做权限校验和路径限制

四、漏洞验证

测试环境准备

  1. 在Windows系统G盘根目录创建测试文件1.txt
  2. 文件内容可设置为"test file content"

漏洞利用步骤

  1. 使用Burp Suite等工具拦截模板编辑请求
  2. 修改请求参数,构造恶意fileName值
  3. 发送请求验证文件读取结果

示例请求

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"

五、修复建议

  1. 输入验证

    • 对fileName参数进行严格过滤
    • 限制文件路径只能访问特定目录
  2. 权限控制

    • 增加文件读取权限校验
    • 确保只有授权用户可以访问文件
  3. 路径限制

    • 使用固定前缀限制文件读取范围
    • 禁止访问系统关键目录
  4. 代码修改示例

// 定义允许访问的模板目录
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的模板管理功能由于缺乏对文件路径的有效限制,导致攻击者可以构造恶意路径读取服务器上的任意文件。该漏洞可能泄露敏感信息,如配置文件、数据库凭证等。开发人员应重视文件操作的安全性,实施严格的输入验证和访问控制。

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