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

浙公网安备 33010602011771号