浅谈JFinal的DenyAccessJsp绕过
字数 1099 2025-08-06 18:07:42

JFinal DenyAccessJsp 绕过机制分析与防御

1. 背景介绍

JFinal 是基于 Java 语言的极速 web 开发框架,在较新版本中默认禁止直接访问 .jsp 文件,以提升应用安全性。这种机制主要通过 DenyAccessJsp 配置实现,但存在潜在的绕过风险。

2. DenyAccessJsp 机制实现原理

2.1 核心配置

在 JFinal 5.0.2 版本中,DenyAccessJsp 默认设置为 true:

public class DemoConfig extends JFinalConfig {
    public void configConstant(Constants me) {
        // 默认拒绝直接访问 JSP
        me.setDenyAccessJsp(true); 
    }
    // 其他配置方法...
}

如需允许直接访问 JSP 文件,需显式设置为 false。

2.2 处理流程

  1. 请求首先经过 JFinalFilter 过滤器
  2. doFilter() 方法中检查 JSP 访问限制:
if (constants.getDenyAccessJsp() && isJsp(target)) {
    HandlerKit.renderError404(request, response, isHandled);
    return;
}
  1. isJsp() 方法实现:
boolean isJsp(String t) {
    char c;
    int end = t.length() - 1;
    if ((end > 3) && ((c = t.charAt(end)) == 'x' || c == 'X')) {
        end--;
    }
    if ((end > 2) && ((c = t.charAt(end)) == 'p' || c == 'P')) {
        end--;
        if ((end > 1) && ((c = t.charAt(end)) == 's' || c == 'S')) {
            end--;
            if ((end > 0) && ((c = t.charAt(end)) == 'j' || c == 'J')) {
                end--;
                if ((end > -1) && ((c = t.charAt(end)) == '.')) {
                    return true;
                }
            }
        }
    }
    return false;
}

3. 绕过机制分析

3.1 关键差异点

  • JFinal 使用 request.getRequestURI() 获取请求路径
  • Tomcat 使用 request.getServletPath() + request.getPathInfo() 获取 JSP 资源路径

3.2 具体绕过方法

方法一:使用分号(;)分隔

访问形式:1.jsp;

原理:

  • getRequestURI() 会获取到完整路径 1.jsp;isJsp() 返回 false
  • Tomcat 解析时会忽略分号后的内容,正确识别为 JSP 文件

方法二:URL 编码绕过

访问形式:1.%6A%73%70 (jsp 的 URL 编码)

原理:

  • getRequestURI() 不会自动解码,isJsp() 无法识别编码后的后缀
  • Tomcat 会自动解码,正确识别为 JSP 文件

4. 防御建议

4.1 开发层面

  1. 文件上传安全

    • 使用白名单机制校验文件扩展名
    • 禁止上传可执行脚本文件
    • 存储上传文件到非 web 可访问目录
  2. JFinal 配置

    • 即使需要直接访问 JSP,也应限制可访问的目录
    • 结合其他安全机制如权限控制
  3. 自定义过滤器

    • 实现更严格的路径检查
    • 对特殊字符和编码进行统一处理

4.2 运维层面

  1. 定期更新 JFinal 框架版本
  2. 配置 WAF 规则拦截可疑请求
  3. 监控异常文件访问行为

5. 总结

JFinal 的 DenyAccessJsp 机制虽然提供了基本的安全防护,但由于路径解析方式的差异,存在绕过风险。开发者不应完全依赖框架的安全机制,而应采取多层次的安全防护措施,特别是在文件上传等高风险功能上实施严格的安全控制。

安全是一个持续的过程,需要结合框架特性、业务场景和最新安全威胁不断调整防护策略。

JFinal DenyAccessJsp 绕过机制分析与防御 1. 背景介绍 JFinal 是基于 Java 语言的极速 web 开发框架,在较新版本中默认禁止直接访问 .jsp 文件,以提升应用安全性。这种机制主要通过 DenyAccessJsp 配置实现,但存在潜在的绕过风险。 2. DenyAccessJsp 机制实现原理 2.1 核心配置 在 JFinal 5.0.2 版本中, DenyAccessJsp 默认设置为 true: 如需允许直接访问 JSP 文件,需显式设置为 false。 2.2 处理流程 请求首先经过 JFinalFilter 过滤器 在 doFilter() 方法中检查 JSP 访问限制: isJsp() 方法实现: 3. 绕过机制分析 3.1 关键差异点 JFinal 使用 request.getRequestURI() 获取请求路径 Tomcat 使用 request.getServletPath() + request.getPathInfo() 获取 JSP 资源路径 3.2 具体绕过方法 方法一:使用分号(;)分隔 访问形式: 1.jsp; 原理: getRequestURI() 会获取到完整路径 1.jsp; , isJsp() 返回 false Tomcat 解析时会忽略分号后的内容,正确识别为 JSP 文件 方法二:URL 编码绕过 访问形式: 1.%6A%73%70 (jsp 的 URL 编码) 原理: getRequestURI() 不会自动解码, isJsp() 无法识别编码后的后缀 Tomcat 会自动解码,正确识别为 JSP 文件 4. 防御建议 4.1 开发层面 文件上传安全 : 使用白名单机制校验文件扩展名 禁止上传可执行脚本文件 存储上传文件到非 web 可访问目录 JFinal 配置 : 即使需要直接访问 JSP,也应限制可访问的目录 结合其他安全机制如权限控制 自定义过滤器 : 实现更严格的路径检查 对特殊字符和编码进行统一处理 4.2 运维层面 定期更新 JFinal 框架版本 配置 WAF 规则拦截可疑请求 监控异常文件访问行为 5. 总结 JFinal 的 DenyAccessJsp 机制虽然提供了基本的安全防护,但由于路径解析方式的差异,存在绕过风险。开发者不应完全依赖框架的安全机制,而应采取多层次的安全防护措施,特别是在文件上传等高风险功能上实施严格的安全控制。 安全是一个持续的过程,需要结合框架特性、业务场景和最新安全威胁不断调整防护策略。