在之前的文章《Java利用技巧——通过反射实现webshell编译文件的自删除》曾介绍了通过反射实现AntSword-JSP-Template的方法。对于AntSword-JSP-Template中的shell.jsp,访问后会额外生成文件shell_jsp$U.class。《Java利用技巧——通过反射实现webshell编译文件的自删除》中的方法,访问后会额外生成文件shell_jsp$1.class。
在某些特殊环境下,需要避免额外生成.class文件。本文将以Zimbra环境为例,介绍实现方法,开源代码,记录细节。
本文将要介绍以下内容:
· 实现思路
· 实现代码
基于《Java利用技巧——通过反射实现webshell编译文件的自删除》中的方法,访问后会额外生成文件shell_jsp$1.class,这里可以通过构造器避免额外生成.class文件。
在具体使用过程中,需要注意如下问题:
(1)反射机制中的构造器
正常调用的代码:
通过反射实现的代码:
(2)选择合适的defineClass()方法
在ClassLoader类中,defineClass()方法有多个重载,可以选择一个可用的重载。
本文选择defineClass(byte[] b, int off, int len)
(3)SecureClassLoader
使用构造器时,应使用SecureClassLoader,而不是ClassLoader
示例代码:
为了方便比较,这里给出每种实现方法的代码:
(1)test1.jsp
来自AntSword-JSP-Template中的shell.jsp,代码如下:
保存在Zimbra的web目录:/opt/zimbra/jetty_base/webapps/zimbra/
通过Web访问后在目录/opt/zimbra/jetty_base/work/zimbra/jsp/org/apache/jsp/生成以下文件:
· _test1_jsp.java
· _test1_jsp.class
· _test1_jsp$U.class
(2)test2.jsp
来自《Java利用技巧——通过反射实现webshell编译文件的自删除》中通过反射实现AntSword-JSP-Template的方法,代码如下:
通过Web访问后生成以下文件:
· _test2_jsp.java
· _test2_jsp.class
· _test2_jsp$1.class
(3)test3.jsp
基于test2.jsp,通过构造器实现,代码如下:
通过Web访问后生成以下文件:
· _test3_jsp.java
· _test3_jsp.class
(4)test4.jsp
基于test3.jsp,不使用base64Decode(),代码如下:
通过Web访问后生成以下文件:
· _test4_jsp.java
· _test4_jsp.class
在代码实现上需要注意Java语言中数组必须先初始化,然后才可以使用。
本文分享了一种不额外生成.class文件的实现方法,对于开源的代码test4.jsp,还可以应用到Java文件的编写中。