java反序列化——URLDNS链

参考文章:https://xz.aliyun.com/t/9417

看爽了,打算自己也跟一遍

实验了在不进行序列化和反序列化的情况下只是执行这个put也可以实现dns的解析

也就是注释了这个set和后面的序列化的情况下,会发出三个请求,如果set之后不序列化的情况下是不会进行dns请求的

跟一遍链子,在序列化都注释的情况下看都经过了什么情况

并且在put那里打个点

首先点击put方法进去打个点

然后debug会自动进入这个点位,在这里取消这个点,因为这里是一直在加载一些文件啥的,然后进程会回到主函数的map.put()

然后再回到这个put函数打个点就正式的进入他会进行的dns的步骤了

在put这里会进行hash(key)

因为key不等于null于是就进入了key.hashCode()函数

这里不能点直接进去了,因为hashCode有很多实现他的具体函数,可以跟着进程步入

这里就在判断hashCode是否为-1,如果不是-1就直接退出了,另外这里默认的情况下就是-1,前面代码为了不让他提前执行于是就设置了为123就是为了在这里进行绕过避免影响序列化时候的dns上请求,后面又设置回-1的目的也就是相当于开启这个点保证后面的序列化可以进行dns的触发

默认-1

跟进hashCode()函数

进入getHostAddress()

 

继续进入getHostAddress()

可以看到这里执行了getByName(host)

后面就全都是一些底层实现的代码了,也就是说到了getByName(host) 就是执行了dns的请求

了解了大致的执行的流程,这个时候寻找一下反序列化的执行的情况

通过在hashCode()函数打点发现在执行readobject的地方进入了

后面继续进程发现进入了byname进行了dns的解析同时dnslog也收到了执行的信息。

原理:java.util.HashMap 重写了 readObject, 在反序列化时会调用 hash 函数计算 key 的 hashCode.而 java.net.URL 的 hashCode 在计算时会调用 getHostAddress 来解析域名, 从而发出 DNS 请求.

也就是说readobject被重写了,所以才会有这段putval()的执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值