Java安全学习笔记4-URLDNS链学习
调试准备
首先我们要明确我们调试的是ysoserial,先从GitHub上把ysoserial下载下来https://github.com/frohoff/ysoserial,然后用idea打开,这时会自动下载依赖项这些,若有问题,自行网上搜索解决方案。
然后找到自己想要调试的那条链的对应payload文件,比如我想调试URLDNS这条链:src/main/java/ysoserial/payloads/URLDNS.java

找到main函数左边的运行按钮,切换成调试,通常这时会报错:

这时因为默认参数为calc.exe,而URLDNS链是要一个url地址,在运行配置处修改参数,我这直接用的yakit的dnslog服务器,记得要加http://

然后就可以愉快打断点调试了
调用函数
先看URLDNS类中的getobject,这个方法返回了一个hashmap对象

我们知道反序列化触发是在readobject方法中,在readobject方法中找到putval方法,打上断点,因为在getobject的注释里(URLDNS.java文件第59行)写了是在计算hash的过程中触发了dnslog
During the put above, the URL’s hashCode is calculated and cached. This resets that so the next time hashCode is called a DNS lookup will be triggered.

开始调试,这时程序会卡在putval处

我们选择步入,选择hash函数,然后继续步入hashcode函数

然后看到hashcode里有一个gethostaddress方法

继续步入,可以看到调用了getbyname方法,触发dns查询

在yakit中看到dns记录如下:

在调试器中也可以看到调用栈

HashMap->readObject
HashMap->hash
URL->hashCode
URLStreamHandler->hashCode
URLStreamHandler->getHostAddress
InetAddress->getByName
构造payload的时候,初始化一个java.net.URL对象,作为key放在HashMap中,然后设置这个URL对象的hashCode初始值为-1,这样反序列化时会重新计算hashCode,才能触发后面的DNS请求。(建议看p神原pdf文档,加入星球可得)