对Java JFinal_cms的一次审计过程
字数 1506 2025-08-25 22:58:20

JFinal CMS 安全审计教学文档

环境搭建

源码获取

数据库配置

  1. 修改 sql/jfinal_cms_v4.sql 文件,在开头添加:
    create database jfinal_cms;
    use jfinal_cms;
    
  2. 使用 Navicat 导入 SQL 文件或 MySQL 命令行执行:
    source /path/to/jfinal_cms_v4.sql
    

开发环境配置

  1. 使用 IntelliJ IDEA 打开项目
  2. IDEA 会自动加载 Maven 依赖
  3. 配置 Tomcat 运行环境

技术架构分析

主要技术组件

  • Web框架: JFinal
  • 模板引擎: Beetl
  • 数据库: MySQL
  • 前端框架: Bootstrap

项目结构

  • 后台管理模块: com.jflyfox.modules.admin
  • 用户控制器: AdminController (路由为 /admin)
  • 模板引擎配置: com.jflyfox.component.config.BaseConfig

安全漏洞审计

XSS漏洞

漏洞1: 用户注册XSS

  • 位置: 用户注册表单
  • 绕过方法:
    1. 前端验证可通过抓包绕过
    2. 后端 RegistController#save 方法缺少严格过滤
  • 利用场景: 管理员查看用户列表时触发

漏洞2: 用户信息修改XSS

  • 位置: 用户个人信息设置
  • 后端代码: PersonController#save
  • 漏洞原因: 直接调用 model.update 无过滤
  • 利用场景: 文章评论处触发

漏洞3: 前端XSS过滤绕过

  • 位置: 文章评论框
  • 过滤机制:
    • JFlyFoxUils#delScriptTag: 删除script/style标签
    • commons-langescapeHtml 方法
  • 绕过方法:
    • 利用HTML实体名称漏洞
    • 使用Unicode编码
    • HTML注释或属性漏洞

SSTI漏洞 (Beetl模板注入)

模板引擎配置

  • 配置文件: /org/beetl/core/beetl-default.properties
  • 关键配置:
    DELIMITER_PLACEHOLDER_START=${ 
    DELIMITER_PLACEHOLDER_END=}
    DELIMITER_STATEMENT_START=<%
    DELIMITER_STATEMENT_END=%>
    TEMPLATE_CHARSET=UTF-8
    NATIVE_SECUARTY_MANAGER=org.beetl.core.DefaultNativeSecurityManager
    

安全限制

  • 默认禁止调用 java.lang.Runtime, Process, ProcessBuilder, System
  • 安全管理器: DefaultNativeSecurityManager

漏洞利用

  1. 利用点: 后台模板管理功能
  2. Payload构造:
    ${@java.lang.Class.forName("java.lang.Runtime").getMethod("exec",
    @java.lang.Class.forName("java.lang.String")).invoke(
    @java.lang.Class.forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null),"calc")}
    
  3. 绕过方法: 使用Java反射机制绕过安全管理器限制

SQL注入漏洞

漏洞位置

  • 后台素材管理: ImageShowController#list
  • 漏洞原因: 直接拼接 orderBy 参数到SQL语句

利用方法

  • Payload示例:
    updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
    
  • 影响: MySQL数据库的order by注入

防御建议

XSS防御

  1. 前后端统一验证
  2. 使用成熟的XSS过滤库
  3. 对用户输入进行HTML实体编码

SSTI防御

  1. 限制模板编辑权限
  2. 加强安全管理器配置
  3. 禁用危险Java类调用

SQL注入防御

  1. 全面使用预编译语句
  2. 避免SQL字符串拼接
  3. 使用ORM框架的安全查询方法

审计方法论

  1. 熟悉项目结构: 了解核心组件和架构
  2. 入口点分析: 从后台管理等高权限区域开始
  3. 数据流追踪: 从用户输入到最终输出的完整路径
  4. 黑盒+白盒结合: 功能测试与代码审计互补
  5. 框架特性研究: 深入理解JFinal和Beetl的工作机制

参考资源

JFinal CMS 安全审计教学文档 环境搭建 源码获取 GitHub: JFinal CMS 源码 Gitee: JFinal CMS 源码 数据库配置 修改 sql/jfinal_cms_v4.sql 文件,在开头添加: 使用 Navicat 导入 SQL 文件或 MySQL 命令行执行: 开发环境配置 使用 IntelliJ IDEA 打开项目 IDEA 会自动加载 Maven 依赖 配置 Tomcat 运行环境 技术架构分析 主要技术组件 Web框架 : JFinal 模板引擎 : Beetl 数据库 : MySQL 前端框架 : Bootstrap 项目结构 后台管理模块: com.jflyfox.modules.admin 用户控制器: AdminController (路由为 /admin ) 模板引擎配置: com.jflyfox.component.config.BaseConfig 安全漏洞审计 XSS漏洞 漏洞1: 用户注册XSS 位置 : 用户注册表单 绕过方法 : 前端验证可通过抓包绕过 后端 RegistController#save 方法缺少严格过滤 利用场景 : 管理员查看用户列表时触发 漏洞2: 用户信息修改XSS 位置 : 用户个人信息设置 后端代码 : PersonController#save 漏洞原因 : 直接调用 model.update 无过滤 利用场景 : 文章评论处触发 漏洞3: 前端XSS过滤绕过 位置 : 文章评论框 过滤机制 : JFlyFoxUils#delScriptTag : 删除script/style标签 commons-lang 的 escapeHtml 方法 绕过方法 : 利用HTML实体名称漏洞 使用Unicode编码 HTML注释或属性漏洞 SSTI漏洞 (Beetl模板注入) 模板引擎配置 配置文件: /org/beetl/core/beetl-default.properties 关键配置: 安全限制 默认禁止调用 java.lang.Runtime , Process , ProcessBuilder , System 安全管理器: DefaultNativeSecurityManager 漏洞利用 利用点 : 后台模板管理功能 Payload构造 : 绕过方法 : 使用Java反射机制绕过安全管理器限制 SQL注入漏洞 漏洞位置 后台素材管理: ImageShowController#list 漏洞原因 : 直接拼接 orderBy 参数到SQL语句 利用方法 Payload示例 : 影响 : MySQL数据库的order by注入 防御建议 XSS防御 前后端统一验证 使用成熟的XSS过滤库 对用户输入进行HTML实体编码 SSTI防御 限制模板编辑权限 加强安全管理器配置 禁用危险Java类调用 SQL注入防御 全面使用预编译语句 避免SQL字符串拼接 使用ORM框架的安全查询方法 审计方法论 熟悉项目结构 : 了解核心组件和架构 入口点分析 : 从后台管理等高权限区域开始 数据流追踪 : 从用户输入到最终输出的完整路径 黑盒+白盒结合 : 功能测试与代码审计互补 框架特性研究 : 深入理解JFinal和Beetl的工作机制 参考资源 Beetl官方文档: https://www.kancloud.cn/xiandafu/beetl3_ guide JFinal官方文档: http://www.jfinal.com