ROME反序列化-TemplatesImpl链子

本文详细探讨了一种通过HashMap调用导致的远程代码执行(RCE)漏洞,涉及对象的hashCode方法链,最终触发TemplatesImpl类的getOutputProperties方法。作者展示了利用过程,并使用ysoserial生成Windows计算器攻击示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

ROME 是一个可以兼容多种格式的 feeds 解析器,可以从一种格式转换成另一种格式,也可返回指定格式或 Java 对象。

正题:

这个链子是通过HashMap调用ObjectBean的hashCode()方法来完成RCE。

这里放一下链子会用到的一些必要代码,接下来进行相应的调试

public int hashCode() {
   return this._equalsBean.beanHashCode();
}

当调用hashCode之后会调用beanHashCode(),之后调用到toString()

图片

public int beanHashCode() {
   return this._obj.toString().hashCode();
}

图片

public String toString() {
   Stack stack = (Stack)PREFIX_TL.get();
   String[] tsInfo = (String[])(stack.isEmpty() ? null : stack.peek());
   String prefix;
   if (tsInfo == null) {
       String className = this._obj.getClass().getName();
       prefix = className.substring(className.lastIndexOf(".") + 1);
   } else {
       prefix = tsInfo[0];
       tsInfo[1] = prefix;
   }

   return this.toString(prefix);
}

这里可以看到返回的prefix是TemplatesImpl

图片

private String toString(String prefix) {
   StringBuffer sb = new StringBuffer(128);

   try {
       PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanClass);
       if (pds != null) {
           for(int i = 0; i < pds.length; ++i) {
               String pName = pds[i].getName();
               Method pReadMethod = pds[i].getReadMethod();
               if (pReadMethod != null && pReadMethod.getDeclaringClass() != Object.class && pReadMethod.getParameterTypes().length == 0) {
                   Object value = pReadMethod.invoke(this._obj, NO_PARAMS);
                   this.printProperty(sb, prefix + "." + pName, value);
               }
           }
       }
   } catch (Exception var8) {
       sb.append("\n\nEXCEPTION: Could not complete " + this._obj.getClass() + ".toString(): " + var8.getMessage() + "\n");
   }

   return sb.toString();
}

在调用完这里之后,我们就会调用TemplatesImpl的链子,这里可以注意到TemplatesImpl的getOutputProperties()是一个无参数的方法,所以刚好可以被调用

图片

这里直接使用ysoserial-master-8eb5cbfbf6-1.jar生成windows下弹计算器的exp并进行base64编码

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值