0x1. 背景介绍

比如fastjsonlog4j中需要远程加载恶意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

所以,尝试手动修改一下这个版本号试试?

  1. 切换到java的15版本,编译运行正常
  2. 使用vim -b Calc.class,然后:%!xxd修改版本号为32(50的16进制,也就是Java6),然后保存::%!xxd -r
  3. 切换java版本到1.7,运行Class正常

⬆︎TOP