14-9

反序列化除了readObject 还有什么触发点

1. readResolve()writeReplace()

这两个方法主要用于控制对象的序列化和反序列化过程,它们可以用来触发攻击链

  • 原理
    • writeReplace():这个方法在对象被序列化时调用。它允许开发者用另一个对象来替换即将被序列化的对象。攻击者可以利用这个方法,让一个无害的对象在序列化时被替换成一个恶意的对象
    • readResolve():这个方法在对象被反序列化后调用。它允许开发者用另一个对象来替换刚刚反序列化得到的对象。攻击者可以利用这个方法,在反序列化时触发攻击链,例如调用一个可以触发 JNDI 注入的类
  • 攻击链举例
    • 攻击者构造一个恶意的对象,这个对象的 readResolve() 方法被重写,用于返回一个可以触发 JNDI 注入的 JdbcRowSetImpl 对象
    • 当应用程序反序列化这个对象时,readResolve() 方法会被自动调用,从而将攻击链的控制权转移到 JdbcRowSetImpl 上,最终导致 RCE