URLDNS链反序列化调试

Java安全之URLDNS链分析

0x00 前言

作为一个java小白,最近学习了下ysoserial生成payload的原理,其中最容易入门学习的就是urldns链,也是在利用java反序列化漏洞时候用来判断是否存在漏洞的基础链。

0x01 原理分析

使用工具:idea
首先从github上下载ysoserial工具(https://github.com/frohoff/ysoserial),并导入idea.由于ysoserial依赖包较多,建议使用maven一次性下载完成。
 
调试步骤:
在pom.xml中,全局搜索mainclass,这里是入口点
通读代码可以发现,这里通过传参加载不同的payload模块生成我们需要的反序列化攻击payload

找到urldns攻击类,可以看到给出了对应的利用链:

我们直接去hashmap readobject类(java.util.HashMap#readObject)源码处putval下断点调试:

可以看到这里首先触发了hash(java.util.HashMap#hash)方法,跟进去看一下:

 

这里调用了hashcode(java.net.URL#hashCode)方法,跟进:

 

具体为啥这里hashCode是-1,我们看一下ysoserial生成payload的时候,使用反射将hashcode手动设置为了-1

 

继续往下看,可以看到调用了URLStreamHandler类的hashcode方法( java.net.URLStreamHandler#hashCode),跟进去看一下:

 

这里首先将url对象传进来,获取了protocol对应的协议为http,然后使用getHostAddress方法将对应域名地址转换为ip,简单跟进看一下:

 

调用url类的getHostAddress

 

可以看到这里调用了getByName方法,该方法用来将域名解析成ip,造成一次DNS请求

 

所以,要完成这个反序列化,首先要实例化一个hashmap对象,并初始化一个URL对象,作为key放在hashmap对象中,还要设置hashcode的值为-1,才能调用到后面的getHostAddress方法从而发起dns请求。

 

0x03 复现测试

生成payload:

java -jar ysoserial.jar URLDNS http://uwuwdq6i2zkw1m8p6ds4fomcp3vujj.burpcollaborator.net >out.bin

漏洞触发代码:

import java.io.ObjectInputStream;
import java.io.FileInputStream;

public class URLDNS {
    public static void main(String[] args) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\admin\\Desktop\\out.bin"));
        ois.readObject();
    }
}

收到DNS回显:

 

 

 

 

 

 

posted @ 2022-02-22 22:01  rain_code  阅读(268)  评论(0)    收藏  举报