问题描述
我开始研究 Java 反序列化小工具。我从著名的 Apache Common Collections 小工具开始,研究了 @matthias_kaiser
的小工具链。
有人可以解释以下内容吗?
-
为什么
TiedMapEntry
是通过 Java 反射设置而不是仅使用HashSet#add()
方法?例如,HashSet hashSet = new HashSet(); hashSet.add(tiedMapEntry);
-
我尝试了上述方法,但遇到了
Caused by: java.io.NotSerializableException: java.lang.ProcessImpl
异常,这让我相信序列化过程中可能会出现问题。 -
任何关于马蒂亚斯如何找出反射“黑客”或他的思维过程的想法? (我也会尝试联系他和其他人)。
如果有其他提示(特别是在调试方面),请分享,因为这将极大地帮助我理解这个漏洞和其他漏洞。
解决方法
-
如果您将
TiedMapEntry
添加到HashSet
,则调用hashCode()
会触发TiedMapEntry.getValue()
,后者在 {{1} 上调用get()
}.这将触发 Transformer 执行,这在那时不是您想要的。 -
1) 的副作用
-
使用调试器并在方法
上设置断点LazyMap
-
通过阅读实现代码并使用合适的 IDE(IDEA、Eclipse)进行调试