文章目录
一、前言
对于进行反序列化漏洞原理的学习,URLDNS这条链比较好理解,对后续学习打个基础,URLDNS也是经常用于验证Java反序列化漏洞是否存在,验证服务主机是否出网等情况,为了后期进一步有效性的利用。让我们开始学习吧!
二、URLDNS利用链复现
2.1 利用链
* Gadget Chain:
* HashMap.readObject()
* HashMap.putVal()
* HashMap.hash()
* URL.hashCode()
2.2 利用过程
java.util.HashMap实现了Serializable接口,重写了readObject, 在反序列化时会调用hash函数计算key的hashCode,而java.net.URL的hashCode在计算时会调用getHostAddress来解析域名, 从而发出DNS请求。
2.3 利用过程原理详解
我们通过查看HashMap源码我们可以发现,继承Serializable,HashMap是可以进行序列化的,这先满足最基本的要求。
HashMap重写了readObject方法,就可以深入看readObject方法调用了哪些可以利用的点。
readObejct方法会调用putVal(hash(key)),hash传递key值,会执行key的hashCode()方法,所以如果这里传递的是URL对象,就会执行URL对象的hashCode方法。
那我们来看看java.net.URL类的hashCode方法是怎么实现DNS解析的。URL的hashCode会调用getHostAddress,getHostAddress会一步步调用到getAddressesFromNameService方法,循环调用nameService的lookupAllHostAddr方法,直到找到地址,lookup就是进行DNS解析,这样当执行了URL的hashCode方法就会进行DNS请求,就是整个源码调用步骤。
2.4 构造poc
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field</