Java BCEL 回显

前言:不懂java的时候,经常有听到关于回显的名词,这个也包含其中,这篇笔记就是记录关于BCEL回显

什么是BCEL

该类存储在com.sun.org.apache.bcel.internal.util包中

BCEL ClassLoade也是一种恢复成一个类并在JVM虚拟机中进行加载的字节序列

BCEL也是在JDK库中,在com.sun.org.apache.bcel.internal.util的包中有一个ClassLoader类,它是一个ClassLoader类,和默认的java.lang包下的ClassLoader类不同,loadClass实现不同而已。

BCEL类的ClassLoader的loadClass方法特征:如果传入的字节数据以$$BCEL$$字符开始,就会进入createClass方法

接着就会通过Utility.decode转换为字节格式,然后通过ClassParser根据Class类的格式来进行解析,生成JavaClass对象

最后通过defineClass来返回一个对应的class对象

这里来模拟下本地通过BCEL的ClassLoader实现命令执行的过程

Example.java

public class Example {
    static{
        try{
            Runtime.getRuntime().exec("calc");
        }catch(Exception e){

        }
    }
}

HelloBCEL.java

public class HelloBCEL {
    public static void main(String[] args) throws Exception{
        JavaClass cls = Repository.lookupClass(Example.class);
        String code = Utility.encode(cls.getBytes(),true);
        System.out.println(code);
        Class<?> aClass = new ClassLoader().loadClass("$$BCEL$$" + code);
        aClass.newInstance();
    }
}

当执行完aClass.newInstance();,则会执行calc

这里顺便回顾下知识点:

1、ClassLoader的loadClass来进行实例化Class的时候,不会触发static静态代码块,只是把类加载到了 JVM 虚拟机中

2、class.forName() 默认会对类进行初始化,会执行类中的 static 代码块

Fastjson BCEL回显

BasicDataSource攻击链只能用于Fastjson 1.2.24及更低版本

Fastjson反序列化解析JSON的时候会触发相关对象中的构造函数和setter特性,这里配合org.apache.tomcat.dbcp.dbcp2包中的BasicDataSource对象来进行回显

那么,当Fastjson反序列化org.apache.tomcat.dbcp.dbcp.BasicDataSource对象时,首先通过setter方法设置其driverClassLoader和driverClassName属性,然后会调用其getConnection方法,又最终调用了createConnectionFactory方法,其通过Class.forName方法用driverClassLoader加载driverClassName,并设置是否初始化参数为true,Class.forName还有印象,第二个参数initial为true时,类加载后将会直接执行static{}块中的代码

明天再来补充

这里需要注意的点:Tomcat自带dpcp这个jar包,而且对于不同的Tomcat版本使用的包名也不同:

  • Tomcat > 8.0 使用 org.apache.tomcat.dbcp.dbcp2.BasicDataSource
  • Tomcat < 8.0 使用 org.apache.tomcat.dbcp.dbcp.BasicDataSource
posted @ 2021-08-16 17:50  zpchcbd  阅读(1546)  评论(0)    收藏  举报