有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

借助Spring的AbstractBeanDefinition的反射实现java序列化

为了在我们的系统中测试vulnerabilities,我想创建一个exploit,它需要从spring-beans序列化^{}

超类^{}有一个属性是不可序列化的:constructorArgumentValues

为了解决这个问题,我编写了以下代码,通过反射将属性修改为transient

// create a bean object
GenericBeanDefinition bean = new GenericBeanDefinition();
bean.setBeanClass(Runtime.class);
bean.setFactoryMethodName("getRuntime");    

// make constructorArgumentValues transient via reflection
try {
    Field field = AbstractBeanDefinition.class.getDeclaredField("constructorArgumentValues");
    Field modifiers = Field.class.getDeclaredField("modifiers");
    modifiers.setAccessible(true);
    modifiers.setInt(field, field.getModifiers() | Modifier.TRANSIENT);

    field.setAccessible(true);
    field.set(bean, null);

} catch (Exception e) { e.printStackTrace(); }

// serialize it
try (FileOutputStream fileOut = new FileOutputStream("test.ser");
     ObjectOutputStream outStream = new ObjectOutputStream(fileOut)) {
    outStream.writeObject(bean);

} catch (IOException e) { e.printStackTrace(); }

不幸的是,我得到:

java.io.NotSerializableException: org.springframework.beans.factory.config.ConstructorArgumentValues

当我在另一个简单类中尝试时,上面的snipplet工作得很好:

class MySerializable implements Serializable {
    private MyUnserializable myUnserializable = new MyUnserializable();
}
class MyUnserializable {
}

我看不出这里有什么问题。谢谢你的帮助


共 (0) 个答案