Java 反序列化小工具 - 为什么这个 ysoserial 有效负载使用反射来设置 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. 任何关于马蒂亚斯如何找出反射“黑客”或他的思维过程的想法? (我也会尝试联系他和其他人)。

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

解决方法

  1. 如果您将 TiedMapEntry 添加到 HashSet,则调用 hashCode() 会触发 TiedMapEntry.getValue(),后者在 {{1} 上调用 get() }.这将触发 Transformer 执行,这在那时不是您想要的。

  2. 1) 的副作用

  3. 使用调试器并在方法 LazyMap

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