浅谈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 处理流程
- 请求首先经过
JFinalFilter过滤器 - 在
doFilter()方法中检查 JSP 访问限制:
if (constants.getDenyAccessJsp() && isJsp(target)) {
HandlerKit.renderError404(request, response, isHandled);
return;
}
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 开发层面
-
文件上传安全:
- 使用白名单机制校验文件扩展名
- 禁止上传可执行脚本文件
- 存储上传文件到非 web 可访问目录
-
JFinal 配置:
- 即使需要直接访问 JSP,也应限制可访问的目录
- 结合其他安全机制如权限控制
-
自定义过滤器:
- 实现更严格的路径检查
- 对特殊字符和编码进行统一处理
4.2 运维层面
- 定期更新 JFinal 框架版本
- 配置 WAF 规则拦截可疑请求
- 监控异常文件访问行为
5. 总结
JFinal 的 DenyAccessJsp 机制虽然提供了基本的安全防护,但由于路径解析方式的差异,存在绕过风险。开发者不应完全依赖框架的安全机制,而应采取多层次的安全防护措施,特别是在文件上传等高风险功能上实施严格的安全控制。
安全是一个持续的过程,需要结合框架特性、业务场景和最新安全威胁不断调整防护策略。