假设我有以下内容:
public class ForNameTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException {
final String s = "java.lang.Integer";
Object test = Class.forName(s).getConstructors()[0].newInstance(222);
System.err.println(test);
}
}
在此代码中,我从String制作了一个对象,该对象的值在编译时已知,因此,我相信此代码可以保证没有漏洞。是否有“ s”可以采用的值来执行任意代码?如果需要,“ s”可以包含所需的代码。
答案 0 :(得分:0)
一个人可能可以修改.class文件,用"java.lang.Integer"
替换字符串池中的字符串"com.something.MaliciousClass"
。此类将被加载,并且其静态初始化程序将被执行。即使构造函数参数不匹配。
但是,如果可以修改.class文件,则可以在其中放置任何类型的恶意代码,仅替换一个String是没有意义的。
如果您的字符串是在编译时分配的,则可能是安全的,如果您从某个地方读取它,请确保它包含您期望的内容,即可以实例化的类的白名单名称。