低版本Java运行高版的Class
0x1. 背景介绍
比如fastjson
、log4j
中需要远程加载恶意class文件的时候,如果恶意Class文件的版本高于目标版本,比如托管在服务器的Class是1.8编译的,但是目标版本是1.7,会导致利用失败。出现类似这样的错误:java.lang.UnsupportedClassVersionError: Unsupported major.minor version
0x2. 解决方法
用低版本的Java,比如1.6去编译Class文件,就可以全版本通用。
还有另外一种方法,手动修改Class文件。当Java版本不同的时候,编译出来的Class文件也会不一样,其中Class文件里面会带上编译的Java版本号:
- 45 = Java 1.1
- 46 = Java 1.2
- 47 = Java 1.3
- 48 = Java 1.4
- 49 = Java 5
- 50 = Java 6
- 51 = Java 7
- 52 = Java 8
- 53 = Java 9
- 54 = Java 10
- 55 = Java 11
- 56 = Java 12
- 57 = Java 13
- 58 = Java 14
- 59 = Java 15
所以,尝试手动修改一下这个版本号试试?
- 切换到
java
的15版本,编译运行正常 - 使用
vim -b Calc.class
,然后:%!xxd
修改版本号为32
(50的16进制,也就是Java6),然后保存::%!xxd -r
- 切换java版本到1.7,运行Class正常