Java 反序列化小工具 - 为什么这个 ysoserial 负载使用反射来设置 TiedMapEntry?
Java Deserialization gadget - Why is this ysoserial payload using reflection to set the TiedMapEntry?
我开始研究 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
异常,这让我相信在序列化过程中可能出了问题。
有什么方法可以找出问题所在吗?关于调试的任何提示以及在哪里查看?
关于 Matthias 可能如何想出反射“hack”或者他的思维过程的任何想法? (我也会尝试联系他和其他人)
如果有其他提示(特别是在调试方面),请分享,因为这将极大地帮助我理解这个漏洞和其他漏洞。
如果您将 TiedMapEntry
添加到 HashSet
,则调用 hashCode()
触发 TiedMapEntry.getValue()
,后者调用 get()
LazyMap
。这将触发变形金刚执行,这不是你想要的。
1) 的副作用
使用调试器并在方法 org.apache.commons.collections.map.LazyMap.get(Object)
上设置断点
通过阅读实现代码并使用适当的IDE调试(IDEA,Eclipse)
我开始研究 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
异常,这让我相信在序列化过程中可能出了问题。有什么方法可以找出问题所在吗?关于调试的任何提示以及在哪里查看?
关于 Matthias 可能如何想出反射“hack”或者他的思维过程的任何想法? (我也会尝试联系他和其他人)
如果有其他提示(特别是在调试方面),请分享,因为这将极大地帮助我理解这个漏洞和其他漏洞。
如果您将
TiedMapEntry
添加到HashSet
,则调用hashCode()
触发TiedMapEntry.getValue()
,后者调用get()
LazyMap
。这将触发变形金刚执行,这不是你想要的。1) 的副作用
使用调试器并在方法
上设置断点org.apache.commons.collections.map.LazyMap.get(Object)
通过阅读实现代码并使用适当的IDE调试(IDEA,Eclipse)