Tapestry4 RCE分析
字数 1293 2025-08-29 08:32:24

Apache Tapestry 4 反序列化漏洞分析与利用

漏洞概述

Apache Tapestry 4 框架中存在一个 Java 反序列化漏洞(CVE-2022-46364),攻击者可以通过构造特殊的"sp"参数触发反序列化操作,无需身份验证即可实现远程代码执行。该漏洞存在于2008年就已停止更新的Tapestry 4版本中,属于一个"上古时代"框架的安全问题。

环境搭建

依赖准备

  1. Tapestry 4.1.6 可通过Maven仓库获取:

    <dependency>
      <groupId>org.apache.tapestry</groupId>
      <artifactId>tapestry-framework</artifactId>
      <version>4.1.6</version>
    </dependency>
    
  2. 推荐使用JDK 1.6环境运行,JDK 1.8可能无法正常工作

Web配置

web.xml 配置示例:

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
  <servlet>
    <servlet-name>ApplicationServlet</servlet-name>
    <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ApplicationServlet</servlet-name>
    <url-pattern>/app</url-pattern>
  </servlet-mapping>
</web-app>

页面结构

Tapestry 4 页面通常由三个文件组成:

  1. 模板文件:[name].html
  2. 页面文件:[name].page
  3. 处理类:[name].class(类名可自定义)

漏洞分析

攻击入口

漏洞的核心在于"sp"参数(Service Parameter的缩写),该参数会被框架自动处理并可能导致反序列化操作。

服务路由

Tapestry 4 的服务请求格式:

/app?service=external/[PageName]&sp=[param 0]&sp=param[1]

主要服务接口为IEngineService,有以下关键实现类:

  • ExternalService
  • DirectService
  • DirectEventService

反序列化调用链

完整的反序列化调用链如下:

  1. LinkFactoryImpl#extractListenerParameters
  2. DataSqueezer#unsqueeze
  3. DataSqueezerImpl#unsqueeze
  4. SqueezeAdaptor#unsqueeze
  5. SerializableAdaptor#unsqueeze
  6. ObjectInputStream#readObject

关键代码分析

DataSqueezerImpl中,根据参数首字母选择适配器:

char prefix = encoded.charAt(0);
SqueezeAdaptor adaptor = this._adaptorByPrefix[prefix - 33];

SerializableAdaptor对应的前缀字符:

  • 'O' (ASCII 79)
  • 'Z' (ASCII 90)

'Z'表示GZIP压缩后的数据,'O'表示纯Base64编码数据。

漏洞利用

利用条件

  1. 目标页面包含FormDirectLink组件(通过jwcid属性标识)
  2. 组件允许接收String类型输入
  3. 知道目标组件的componentId

攻击步骤

  1. 构造反序列化Payload(使用Commons Beanutils等常见库)
  2. Base64编码Payload,前缀加上'O'
  3. 发送请求:
    /app?service=direct&sp=O[Base64Payload]&page=Form&component=$Form
    

示例Payload

使用ysoserial生成CommonsBeanutils1的Payload:

java -jar ysoserial.jar CommonsBeanutils1 "calc" | base64

构造最终参数:

sp=O[rO0AB....(base64 encoded payload)]

防御措施

  1. 升级到Tapestry 5或更高版本
  2. 若必须使用Tapestry 4,应实施以下防护:
    • 过滤反序列化操作
    • 使用安全管理器限制危险操作
    • 对输入参数进行严格校验

总结

该漏洞展示了老旧框架中存在的安全隐患,通过精心构造的"sp"参数,攻击者可利用内置的反序列化功能实现RCE。漏洞利用需要特定组件支持,但在实际应用中,表单(Form)组件非常常见,使得该漏洞具有较高的实际危害性。

Apache Tapestry 4 反序列化漏洞分析与利用 漏洞概述 Apache Tapestry 4 框架中存在一个 Java 反序列化漏洞(CVE-2022-46364),攻击者可以通过构造特殊的"sp"参数触发反序列化操作,无需身份验证即可实现远程代码执行。该漏洞存在于2008年就已停止更新的Tapestry 4版本中,属于一个"上古时代"框架的安全问题。 环境搭建 依赖准备 Tapestry 4.1.6 可通过Maven仓库获取: 推荐使用JDK 1.6环境运行,JDK 1.8可能无法正常工作 Web配置 web.xml 配置示例: 页面结构 Tapestry 4 页面通常由三个文件组成: 模板文件: [name].html 页面文件: [name].page 处理类: [name].class (类名可自定义) 漏洞分析 攻击入口 漏洞的核心在于"sp"参数(Service Parameter的缩写),该参数会被框架自动处理并可能导致反序列化操作。 服务路由 Tapestry 4 的服务请求格式: 主要服务接口为 IEngineService ,有以下关键实现类: ExternalService DirectService DirectEventService 反序列化调用链 完整的反序列化调用链如下: LinkFactoryImpl#extractListenerParameters DataSqueezer#unsqueeze DataSqueezerImpl#unsqueeze SqueezeAdaptor#unsqueeze SerializableAdaptor#unsqueeze ObjectInputStream#readObject 关键代码分析 在 DataSqueezerImpl 中,根据参数首字母选择适配器: SerializableAdaptor 对应的前缀字符: 'O' (ASCII 79) 'Z' (ASCII 90) 'Z'表示GZIP压缩后的数据,'O'表示纯Base64编码数据。 漏洞利用 利用条件 目标页面包含 Form 或 DirectLink 组件(通过 jwcid 属性标识) 组件允许接收String类型输入 知道目标组件的componentId 攻击步骤 构造反序列化Payload(使用Commons Beanutils等常见库) Base64编码Payload,前缀加上'O' 发送请求: 示例Payload 使用ysoserial生成CommonsBeanutils1的Payload: 构造最终参数: 防御措施 升级到Tapestry 5或更高版本 若必须使用Tapestry 4,应实施以下防护: 过滤反序列化操作 使用安全管理器限制危险操作 对输入参数进行严格校验 总结 该漏洞展示了老旧框架中存在的安全隐患,通过精心构造的"sp"参数,攻击者可利用内置的反序列化功能实现RCE。漏洞利用需要特定组件支持,但在实际应用中,表单(Form)组件非常常见,使得该漏洞具有较高的实际危害性。