Java安全之Resin解析漏洞分析
字数 1390 2025-08-25 22:58:29

Resin解析漏洞深入分析与利用

前言

Resin是一款流行的Java应用服务器,其独特的解析机制存在一些安全特性,可以被利用进行漏洞利用。本文将详细分析Resin的解析流程、路径处理机制以及相关安全漏洞。

解析流程分析

请求路径处理

Resin对类似/webshell.jsp/123.txt的路径有特殊处理机制:

  1. 请求首先进入com.caucho.server.webapp.WebApp#buildInvocation方法
  2. 系统从_filterChainCache通过请求路径获取缓存的FilterChainEntry
  3. 若缓存未命中,则调用_servletMapper.mapServlet获取处理链

关键正则匹配

Resin使用正则表达式^.*\.jsp(?=/)|^.*\.jsp\z进行URI匹配:

  • 该正则能将xxx.jsp/123.xxx匹配为xxx.jsp
  • 请求最终会走ServletMapping[url-pattern=*.jsp, name=resin-jsp]的处理机制

处理链创建与执行

  1. com.caucho.server.dispatch.ServletMapper#mapServlet中创建处理链
  2. 最终在com.caucho.server.http.HttpRequest#handleRequest调用invocation.service
  3. 执行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编码解析,调用栈如下:

  1. splitQueryAndUnescape:254, InvocationDecoder
  2. buildInvocation:1594, AbstractHttpRequest
  3. getInvocation:1583, AbstractHttpRequest
  4. handleRequest: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进行规范化处理,有以下限制:

  1. URI最大长度限制为1024字符(通过_maxURILength控制)
  2. /后面不能接分号;,如/;会报错
  3. 允许/.但不允许/.;
  4. 路径遍历只能以/../方式,不支持Shiro中的..;/形式

参考文章

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解析规则: QuercusServlet 会调用Quercus引擎解析PHP文件 官方文档:http://quercus.caucho.com/ 路径解析特性 Escape编码解析 Resin支持Unicode escape编码解析,调用栈如下: splitQueryAndUnescape:254, InvocationDecoder buildInvocation:1594, AbstractHttpRequest getInvocation:1583, AbstractHttpRequest handleRequest:825, HttpRequest 关键解码过程: com.caucho.server.dispatch.InvocationDecoder#normalizeUriEscape 方法循环遍历路径字符 匹配到 % 字符时调用 scanUriEscape 方法 scanUriEscape 取四个字符进行Escape解码(如 %u0077 解码为'w') 示例攻击路径: 解码后为: /untitled/webshell.jsp/123.txt 编码规范限制 在解码后,Resin会调用 normalizeUri 进行规范化处理,有以下限制: URI最大长度限制为1024字符(通过 _maxURILength 控制) / 后面不能接分号 ; ,如 /; 会报错 允许 /. 但不允许 /.; 路径遍历只能以 /../ 方式,不支持Shiro中的 ..;/ 形式 参考文章 Resin解析漏洞分析