Tapestry4 RCE分析
字数 1293 2025-08-29 08:32:24
Apache Tapestry 4 反序列化漏洞分析与利用
漏洞概述
Apache Tapestry 4 框架中存在一个 Java 反序列化漏洞(CVE-2022-46364),攻击者可以通过构造特殊的"sp"参数触发反序列化操作,无需身份验证即可实现远程代码执行。该漏洞存在于2008年就已停止更新的Tapestry 4版本中,属于一个"上古时代"框架的安全问题。
环境搭建
依赖准备
-
Tapestry 4.1.6 可通过Maven仓库获取:
<dependency> <groupId>org.apache.tapestry</groupId> <artifactId>tapestry-framework</artifactId> <version>4.1.6</version> </dependency> -
推荐使用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 页面通常由三个文件组成:
- 模板文件:
[name].html - 页面文件:
[name].page - 处理类:
[name].class(类名可自定义)
漏洞分析
攻击入口
漏洞的核心在于"sp"参数(Service Parameter的缩写),该参数会被框架自动处理并可能导致反序列化操作。
服务路由
Tapestry 4 的服务请求格式:
/app?service=external/[PageName]&sp=[param 0]&sp=param[1]
主要服务接口为IEngineService,有以下关键实现类:
ExternalServiceDirectServiceDirectEventService
反序列化调用链
完整的反序列化调用链如下:
LinkFactoryImpl#extractListenerParametersDataSqueezer#unsqueezeDataSqueezerImpl#unsqueezeSqueezeAdaptor#unsqueezeSerializableAdaptor#unsqueezeObjectInputStream#readObject
关键代码分析
在DataSqueezerImpl中,根据参数首字母选择适配器:
char prefix = encoded.charAt(0);
SqueezeAdaptor adaptor = this._adaptorByPrefix[prefix - 33];
SerializableAdaptor对应的前缀字符:
- 'O' (ASCII 79)
- 'Z' (ASCII 90)
'Z'表示GZIP压缩后的数据,'O'表示纯Base64编码数据。
漏洞利用
利用条件
- 目标页面包含
Form或DirectLink组件(通过jwcid属性标识) - 组件允许接收String类型输入
- 知道目标组件的componentId
攻击步骤
- 构造反序列化Payload(使用Commons Beanutils等常见库)
- Base64编码Payload,前缀加上'O'
- 发送请求:
/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)]
防御措施
- 升级到Tapestry 5或更高版本
- 若必须使用Tapestry 4,应实施以下防护:
- 过滤反序列化操作
- 使用安全管理器限制危险操作
- 对输入参数进行严格校验
总结
该漏洞展示了老旧框架中存在的安全隐患,通过精心构造的"sp"参数,攻击者可利用内置的反序列化功能实现RCE。漏洞利用需要特定组件支持,但在实际应用中,表单(Form)组件非常常见,使得该漏洞具有较高的实际危害性。