IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Javaweb安全——反序列化漏洞-CC&CB链思路整理 -> 正文阅读

[网络协议]Javaweb安全——反序列化漏洞-CC&CB链思路整理

前言

最近事情比较多,也没心思静下来好好学点新东西。面试的时候被问到反序列化链过程,就回忆起个大概开头结尾的样子真蛮尴尬的,炒个冷饭,回顾一下之前学过的常用反序列化链。
ps:如有错误烦请指正,不胜感激。(画图可能哪错了没注意到)

Commons-Collections

Commons-Collections <= 3.2.1

CC1

通过动态代理类AnnotationInvocationHandler的invoke方法调用LazyMap#get()去触发ChainedTransformer恶意对象反射链。

ObjectInputStream#readObject()
	AnnotationInvocationHandler#readObject()
		Map(Proxy)#entrySet()
			AnnotationInvocationHandler#invoke()
				LazyMap#get()
       						 //恶意对象反射链部分
					ChainedTransformer#transform()
						ConstantTransformer#transform()
                        InvokerTransformer#transform()
                        	Method#invoke()
                        		Class#getMethod()
                        InvokerTransformer#transform()
                        	Method#invoke()
                        		Runtime#getRuntime()
                        InvokerTransformer#transform()
                        	Method#invoke()
                        		Runtime#exec()

在这里插入图片描述

CC3

为了绕过一些规则对InvokerTransformer的限制而产生的,使用InstantiateTransformer类代替InvokerTransformer类。因为不能通过transform回调对象的相应方法了,所以将代码执行部分换为了TemplatesImpl动态加载字节码。

ObjectInputStream#readObject()
	AnnotationInvocationHandler#readObject()
		Map(Proxy)#entrySet()
			AnnotationInvocationHandler#invoke()
				LazyMap#get()
					ChainedTransformer#transform()
						InstantiateTransformer#transform()
    						TrAXFilter#TrAXFilter()
	TemplatesImpl#newTransformer()
		TemplatesImpl#getTransletInstance()
			TemplatesImpl#defineTransletClasses()
			TemplatesImpl$TransletClassLoader#defineclass()

在这里插入图片描述

CC5

这个链主要是为了解决高版本利用问题,使用BadAttributeValueExpException替换AnnotationInvocationHandler配合TiedMapEntry#toString()去串联LazyMap#get()调用transform()触发ChainedTransformer恶意对象反射链。

在8u71以后Java官方修改了sun.reflect.annotation.AnnotationInvocationHandler 的readObject函数:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/f8a528d0379d

改动后,不再直接使用反序列化得到的Map对象,而是新建了一个LinkedHashMap对象,并将原来的键值添加进去,传进去的恶意Map不再执行set或put操作,便无法触发transform。

ObjectInputStream#readObject()
    BadAttributeValueExpException#readObject()
    	TiedMapEntry#toString()
    		LazyMap#get()
                       //恶意对象反射链部分
    				ChainedTransformer.transform()
                            ConstantTransformer#transform()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Class#getMethod()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#getRuntime()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#exec()

在这里插入图片描述

CC6

同样也是高版本适用,用HashXXX设置值的时候计算hashCode来调用LazyMap#get(),其实和DNSURL那个道理差不多。

ObjectInputStream#readObject()
	HashSet#readObject()
		HashMap#put()
			HashMap#hash()
				TiedMapEntry#hashCode()
					TiedMapEntry#getValue()
						LazyMap#get()
                                	//恶意对象反射链部分
    					  ChainedTransformer.transform()
                            ConstantTransformer#transform()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Class#getMethod()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#getRuntime()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#exec()

在这里插入图片描述

CC7

换了Hashtable类,利用其reconstitutionPut方法中比较key的值,会调用LazyMap的equals方法。

image-20221028203503495

而其并没有实现该方法就会调用其父类的equals方法最后到AbstractMap#equals()那有个m.get(key)操作去串连LazyMap#get()

image-20221028203800513

Hashtable#readObject()
    Hashtable#reconstitutionPut()
		AbstractMapDecorator#equals()
    		AbstractMap#equals()
    			LazyMap#get()
                                	//恶意对象反射链部分
    					ChainedTransformer#transform()
                            ConstantTransformer#transform()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Class#getMethod()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#getRuntime()
                            InvokerTransformer#transform()
                            	Method#invoke()
                            		Runtime#exec()

在这里插入图片描述

Commons-Collections == 4.0

使用PriorityQueue的排序操作需要进行comparator.compare() 操作来比较两个元素大小,从而调用TransformingComparator#compare()触发下面的命令执行部分。

CC2

InvokerTransformer#transform()去触发TemplatesImpl链来加载恶意字节码。

ObjectInputStream#readObject()
    PriorityQueue#readObject()
    ...//排序操作
		PriorityQueue#heapify()
    	PriorityQueue#siftDown()
    	PriorityQueue#siftDownUsingComparator()
    ...
    	TransformingComparator#compare()
    		InvokerTransformer#transform()
TemplatesImpl#newTransformer()
		TemplatesImpl#getTransletInstance()
			TemplatesImpl#defineTransletClasses()
			TemplatesImpl$TransletClassLoader#defineclass()

CC4

使用InstantiateTransformer类代替InvokerTransformer类和CC3差不多。

ObjectInputStream#readObject()
    PriorityQueue#readObject()
    ...//排序操作
		PriorityQueue#heapify()
    	PriorityQueue#siftDown()
    	PriorityQueue#siftDownUsingComparator()
    ...
    	TransformingComparator#compare()
    		ChainedTransformer#transform()
    			InstantiateTransformer#transform()
    				TrAXFilter#TrAXFilter()
	TemplatesImpl#newTransformer()
		TemplatesImpl#getTransletInstance()
			TemplatesImpl#defineTransletClasses()
			TemplatesImpl$TransletClassLoader#defineclass()

在这里插入图片描述

Common-Collections总结

在这里插入图片描述

如上图所示基本上起点终点就是那几个点然后相互拼接:

image-20221028181154319

Shiro RememberMe 漏洞检测的探索之路》中Koalr师傅已经对CommonsCollections 系列 gadget进行了提纯变成以下四条

  • CommonsCollectionsK1 (commons-Collections <= 3.2.1 && allowTemplates)
  • CommonsCollectionsK2 (commons-Collections == 4.0 && allowTemplates)
  • CommonsCollectionsK3 (commons-Collections <= 3.2.1)
  • CommonsCollectionsK4 (commons-Collections == 4.0)

起点部分都变成更简洁的HashMap:

HashMap#readObject()
    HashMap#hash()
    	TiedMapEntry#hashCode()
    		TiedMapEntry#getValue()
                LazyMap#get()

对命令执行部分的调用分别为

  • InvokerTransformer调用TemplatesImpl
  • ChainedTransformer

对 commons-Collections4 的适配则直接用LazyMap.lazyMap替换LazyMap.decorate

具体代码在:https://github.com/zema1/ysoserial/tree/master/src/main/java/ysoserial/payloads

恶意类总结:

下图截取自文章《玩转Ysoserial-CommonsCollection的七种利用方式分析

image-20221028215050049

CommonsBeanutils

用了CC 2&4 链的上面部分,使用PriorityQueue的排序操中比较大小的comparator#compare()去调用org.apache.commons.beanutils.BeanComparator#compare()这里面会去调用PropertyUtils.getProperty()静态方法

image-20221028213012409

该方法会自动找到类属性的getter方法,也就串连起来TemplatesImpl#getOutputProperties() 利用TemplatesImpl进行恶意类加载。

ObjectInputStream#readObject()
    PriorityQueue#readObject()
    ...//排序操作
		PriorityQueue#heapify()
    	PriorityQueue#siftDown()
    	PriorityQueue#siftDownUsingComparator()
    ...
    	BeanComparator#compare()
    		PropertyUtils#getProperty()
    ...
  TemplatesImpl#getOutputProperties() 		
	TemplatesImpl#newTransformer()
		TemplatesImpl#getTransletInstance()
			TemplatesImpl#defineTransletClasses()
			TemplatesImpl$TransletClassLoader#defineclass()

在这里插入图片描述

参考

https://github.com/frohoff/ysoserial

Java安全漫谈

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:34:57  更:2022-10-31 12:38:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:37:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码