Java安全之Resin解析漏洞分析
字数 1390 2025-08-25 22:58:29
Resin解析漏洞深入分析与利用
前言
Resin是一款流行的Java应用服务器,其独特的解析机制存在一些安全特性,可以被利用进行漏洞利用。本文将详细分析Resin的解析流程、路径处理机制以及相关安全漏洞。
解析流程分析
请求路径处理
Resin对类似/webshell.jsp/123.txt的路径有特殊处理机制:
- 请求首先进入
com.caucho.server.webapp.WebApp#buildInvocation方法 - 系统从
_filterChainCache通过请求路径获取缓存的FilterChainEntry - 若缓存未命中,则调用
_servletMapper.mapServlet获取处理链
关键正则匹配
Resin使用正则表达式^.*\.jsp(?=/)|^.*\.jsp\z进行URI匹配:
- 该正则能将
xxx.jsp/123.xxx匹配为xxx.jsp - 请求最终会走
ServletMapping[url-pattern=*.jsp, name=resin-jsp]的处理机制
处理链创建与执行
- 在
com.caucho.server.dispatch.ServletMapper#mapServlet中创建处理链 - 最终在
com.caucho.server.http.HttpRequest#handleRequest调用invocation.service - 执行filterChain到
com.caucho.server.dispatch.PageFilterChain#doFilter进行JSP页面处理
PHP解析机制
在/conf/app-default.xml配置文件中存在PHP解析规则:
<servlet-mapping url-pattern="*.php" servlet-name="php"/>
<servlet servlet-name="php" servlet-class="com.caucho.quercus.servlet.QuercusServlet"/>
QuercusServlet会调用Quercus引擎解析PHP文件- 官方文档:http://quercus.caucho.com/
路径解析特性
Escape编码解析
Resin支持Unicode escape编码解析,调用栈如下:
splitQueryAndUnescape:254, InvocationDecoderbuildInvocation:1594, AbstractHttpRequestgetInvocation:1583, AbstractHttpRequesthandleRequest:825, HttpRequest
关键解码过程:
com.caucho.server.dispatch.InvocationDecoder#normalizeUriEscape方法循环遍历路径字符- 匹配到
%字符时调用scanUriEscape方法 scanUriEscape取四个字符进行Escape解码(如%u0077解码为'w')
示例攻击路径:
http://localhost:8088/untitled/%u0077%u0065%u0062%u0073%u0068%u0065%u006c%u006c%u002e%u006a%u0073%u0070%u002f%u0031%u0032%u0033%u002e%u0074%u0078%u0074
解码后为:/untitled/webshell.jsp/123.txt
编码规范限制
在解码后,Resin会调用normalizeUri进行规范化处理,有以下限制:
- URI最大长度限制为1024字符(通过
_maxURILength控制) /后面不能接分号;,如/;会报错- 允许
/.但不允许/.; - 路径遍历只能以
/../方式,不支持Shiro中的..;/形式