Java 反序列化小工具 - 为什么这个 ysoserial 负载使用反射来设置 TiedMapEntry?

Java Deserialization gadget - Why is this ysoserial payload using reflection to set the TiedMapEntry?

我开始研究 Java 反序列化小工具。我从著名的 Apache Common Collections 小工具开始,并查看了 @matthias_kaiser 的小工具链。

https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections6.java#L65-L100

有人可以解释一下吗?

  1. 为什么 TiedMapEntry 通过 Java 反射设置而不是仅使用 HashSet#add() 方法?例如,

    HashSet hashSet = new HashSet();
    hashSet.add(tiedMapEntry);
    
  2. 我尝试了上面的方法,我得到了一个 Caused by: java.io.NotSerializableException: java.lang.ProcessImpl 异常,这让我相信在序列化过程中可能出了问题。

  3. 有什么方法可以找出问题所在吗?关于调试的任何提示以及在哪里查看?

  4. 关于 Matthias 可能如何想出反射“hack”或者他的思维过程的任何想法? (我也会尝试联系他和其他人)

如果有其他提示(特别是在调试方面),请分享,因为这将极大地帮助我理解这个漏洞和其他漏洞。

  1. 如果您将 TiedMapEntry 添加到 HashSet,则调用 hashCode() 触发 TiedMapEntry.getValue(),后者调用 get() LazyMap。这将触发变形金刚执行,这不是你想要的。

  2. 1) 的副作用

  3. 使用调试器并在方法 org.apache.commons.collections.map.LazyMap.get(Object)

    上设置断点
  4. 通过阅读实现代码并使用适当的IDE调试(IDEA,Eclipse)