使用tabby分析rome反序列化链
字数 1404 2025-08-29 08:30:05
ROME反序列化链分析与利用指南
1. 分析环境与工具
- ROME版本: 1.7
- JDK版本: 8
- 分析工具: Tabby 2.0
2. ROME反序列化链概述
ROME库中存在多个反序列化利用链,主要包括以下几种情况:
- ToStringBean利用链
- EqualsBean利用链
- BadAttributeValueExpException利用链
- JdbcRowSetImpl利用链
3. ToStringBean利用链分析
3.1 调用链路径
HashMap.readObject() -> EqualsBean.hashCode() -> EqualsBean.beanHashCode() -> ToStringBean.toString()
3.2 关键点分析
- Sink点:
toString()函数 - Source点:
HashMap的readObject方法
3.3 Tabby查询优化
初始查询可能无法直接找到目标链,需要逐步优化:
- 显式指定
EqualsBean类,避免关联到其他类的hashCode方法 - 处理
java.lang.Object#toString到ToStringBean#toString的关联关系 - 添加alias关系来完善调用链
3.4 查询示例
/* 初始查询可能无法直接找到目标链 */
/* 需要显式指定EqualsBean类 */
FROM java.util.HashMap#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"toString"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.ToStringBean"
3.5 POC示例
// ToStringBean POC示例代码
EqualsBean equalsBean = new EqualsBean(ToStringBean.class, new Object());
HashMap map = new HashMap();
map.put(equalsBean, "value");
// 序列化map对象进行利用
4. EqualsBean利用链分析
4.1 调用链路径
HashSet.readObject() -> EqualsBean.equals() -> EqualsBean.beanEquals()
4.2 关键点分析
- Sink点:
EqualsBean.beanEquals方法 - Source点:
HashSet.readObject方法
4.3 Tabby查询
FROM java.util.HashSet#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"beanEquals"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.EqualsBean"
5. BadAttributeValueExpException利用链
5.1 特点
- Source点变化: 使用
BadAttributeValueExpException作为起点 - Sink点不变: 仍然是
ToStringBean.toString()
5.2 关键点
需要处理Object.toString到ObjectBean.toString的关联关系,查询时可以限定具体类来减少干扰。
5.3 Tabby查询示例
FROM javax.management.BadAttributeValueExpException#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"toString"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.ToStringBean"
6. JdbcRowSetImpl利用链分析
6.1 调用链路径
JdbcRowSetImpl.getDatabaseMetaData() -> JdbcRowSetImpl.connect() -> InitialContext.lookup()
6.2 关键点分析
- 利用
JdbcRowSetImpl中的getter方法 - 不同于之前的TemplatesImpl利用链,这里通过JNDI注入实现利用
6.3 替代路径
com.sun.rowset.JdbcRowSetImpl#getParameterMetaData也可以调用到lookup方法,形成新的利用链。
6.4 Tabby查询示例
/* 主利用链查询 */
FROM com.sun.rowset.JdbcRowSetImpl#getDatabaseMetaData() AS source
MATCH source-[*]->(sink:Method {NAME:"lookup"})
WHERE sink.CLASSNAME = "javax.naming.InitialContext"
/* 替代利用链查询 */
FROM com.sun.rowset.JdbcRowSetImpl#getParameterMetaData() AS source
MATCH source-[*]->(sink:Method {NAME:"lookup"})
WHERE sink.CLASSNAME = "javax.naming.InitialContext"
7. 总结与防御建议
7.1 利用链总结
- ToStringBean链: 通过
HashMap触发toString调用 - EqualsBean链: 通过
HashSet触发equals调用 - BadAttributeValueExpException链: 通过异常对象触发
toString - JdbcRowSetImpl链: 通过JNDI注入实现远程代码执行
7.2 防御建议
- 升级ROME库到最新安全版本
- 限制反序列化操作,使用白名单机制
- 禁用危险的JNDI查找功能
- 使用安全工具检测和阻断恶意序列化数据
7.3 分析技巧
- 在Tabby分析时,需要逐步细化查询条件
- 注意处理父类方法到子类实现的多态关系
- 可以通过添加alias关系来完善调用链
- 同一类中可能存在多个可利用的入口点
通过深入理解这些利用链的原理和Tabby的分析方法,可以更好地发现和防御反序列化漏洞。