换个视角分析JAVA反序列化URLDNS链

💡 原文中文,约9100字,阅读约需22分钟。
📝

内容提要

本文探讨了如何通过Java中的HashMap和URL类触发DNS请求,分析了反序列化过程中的hashCode计算及其对DNS请求的影响。通过代码示例,展示了在未反序列化情况下直接触发请求的方法,以及通过反序列化确保请求发生的方式。

🎯

关键要点

  • 本文探讨了如何通过Java中的HashMap和URL类触发DNS请求。
  • 分析了反序列化过程中的hashCode计算及其对DNS请求的影响。
  • 展示了在未反序列化情况下直接触发请求的方法。
  • 通过反序列化确保请求发生的方式。
  • 基本的利用链包括HashMap.readObject()、HashMap.putVal()、HashMap.hash()和URL.hashCode()。
  • 未反序列化的例子中,直接构造HashMap并放入URL对象即可触发DNS请求。
  • hash方法通过调用key的hashCode()来计算哈希值,确保请求的触发。
  • 反序列化时,HashMap会尝试恢复存储的URL对象,进而触发DNS请求。
  • 通过反射修改URL对象的hashCode属性以确保反序列化时触发DNS请求。
  • handler属性被transient修饰,但在对象生命周期中仍然存在,影响hashCode的计算。
  • 文中提供了相关参考资料链接,供读者深入了解。

延伸问答

如何通过Java中的HashMap和URL类触发DNS请求?

可以通过构造HashMap并将URL对象作为键直接触发DNS请求,无需反序列化。

反序列化过程中hashCode的计算是如何影响DNS请求的?

反序列化时,HashMap会尝试恢复存储的URL对象,调用其hashCode方法,从而触发DNS请求。

为什么URL类中的handler属性会影响hashCode的计算?

虽然handler被transient修饰,但在URL对象的生命周期中仍然存在,影响hashCode的计算。

如何通过反射修改URL对象的hashCode属性?

可以使用反射获取URL类的hashCode字段,并将其设为非-1的值以确保反序列化时触发DNS请求。

在未反序列化的情况下,如何直接触发DNS请求?

通过直接构造HashMap并将URL对象放入其中,即可触发DNS请求。

反序列化时如何确保DNS请求的触发?

在反序列化前,将URL对象的hashCode属性修改为非-1的值,确保在反序列化时调用handler的hashCode。

➡️

继续阅读