【Java安全】ysoserial-URLDNS链分析

2024-02-06 13:28

本文主要是介绍【Java安全】ysoserial-URLDNS链分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

Java安全中经常会提到反序列化,一个将Java对象转换为字节序列传输(或保存)并在接收字节序列后反序列化为Java对象的机制,在传输(或保存)的过程中,恶意攻击者能够将传输的字节序列替换为恶意代码进而触发反序列化漏洞。其中最经典的反序列化漏洞利用工具——ysoserial,下面就分析学习一下ysoserial中的URLDNS链,以便更好地理解反序列化漏洞。

ysoserial简单分析

下载ysoserialhttps://github.com/frohoff/ysoserial项目源码,导入IDEA,并在pom.xml中搜索mainclass,寻找程序的入口点
在这里插入图片描述在程序运行之前,先设置两个参数(URLDNS “http://xxxx.dnslog.cn”),否则运行IDEA会报错。
在这里插入图片描述简单分析一下 GeneratePayload 的main方法,首先会判断是否传入两个参数, 如果不是则打印帮助信息 ,是的话则对两个参数依次赋值为payloadType和command。接着实例化一个payloadClass对象,跟进一下getPayloadClass方法在这里插入图片描述
getPayloadClass会返回一个反射的class对象,该class对象为GeneratePayload的class对象的包名+字符串“payloads”+我们传入的第一个参数className(也就是payloadType)
在这里插入图片描述对应ysoserial中写好的URLDNS脚本,也就是说,我们传入的第一个参数是找到ysoerial的payload脚本。
在这里插入图片描述后续会实例化payloadClass,并调用getObject方法,传入我们传入的第二个参数command。跟进getObject方法中,分析传入command后,程序是如何处理的。

在这里插入图片描述

发现最终会跳转到URLDNS中
在这里插入图片描述

那么以上操作就是根据传入的参数,定位到利用链的类文件中,调用该类的 getObject方法,生成并返回paylaod。
URLDNS类我们先放到一边,继续分析 GeneratePayload 中的main方法。
在这里插入图片描述之后会调用 serialize方法,将URLDNS类中返回的值(生成的payload)序列化并打印输出。
在这里插入图片描述

URLDNS链分析

URLDNS为Java的原生类,利用效果只是触发一次DNS请求,并不会命令执行,适用于验证是否存在反序列化漏洞。
在URLDNS.java中,作者已经给出了Gadget chain
在这里插入图片描述我们先看第53行代码,首先声明了一个URLStreamHandler类,因为URLStreamHandler是个抽象类,不能够被实例化,因此创建了个URLStreamHandler的子类SilentURLStreamHandler。并实现父类URLStreamHandler的抽象方法openConnection。
在这里插入图片描述但为什么要重写getHostAddress方法呢,其实我们运用最简单粗暴的方法,将重写方法注释掉,对比没注释之前,有啥区别:区别在于,重写getHostAddress,在我们使用ysoserial生成payload时,不会触发payload,DNSLOG接收不到请求。即因为方法直接返回为Null,不会请求我们的hostAddress
在这里插入图片描述而且在URL.java中,handler被transient关键字修饰,在序列化对象的时候,handler属性不会被序列化。意味着重写的方法并不会带进我们的payload中,这样我们在触发反序列化漏洞时,getHostAddress并没有被重写,能够正常请求我们的网址。这也是我觉得很精妙的一个地方,写ysoserial的人真是个天才!太牛*了!
在这里插入图片描述然后查看HashMap类,发现HashMap实现了Serializable序列化接口
在这里插入图片描述重写了readObject方法
在这里插入图片描述在重写的readObject方法中,有调用putVal方法进行一个hash计算
在这里插入图片描述调试,跟进putVal方法, 参数key和value都为输入的dnslog地址

在这里插入图片描述继续跟进,这里注意(标重点),调用的是key.hashCode(),即HashMap的参数u,顺利的从HashMap.hash()跳转到URL.hashCode()。
在这里插入图片描述
这里hashCode()方法会对hashCode属性重新赋值
在这里插入图片描述这里调用了 URLStreamHandler 类的hashCode方法,参数(URL)u为传入的DNSLOG地址
在这里插入图片描述通过getProtocol方法,获取 协议类型——http
在这里插入图片描述接下来这里进行一个if判断,h的值会加上portocal的hashCode()方法的返回值,跟进protocol.hashCode()方法
在这里插入图片描述继续往下调试
在这里插入图片描述最后将(String)http的hash值经过一系列的运算赋值给h。
在这里插入图片描述继续跟进,调用了getHostAdress方法
在这里插入图片描述查看getHostAdress,先后调用getHost()、getByName()两个方法,最终是通过getByName(getHost())去发送dnslog请求
在这里插入图片描述 分析到这里,dnslog就接收到了请求信息

结论

因为HashMap实现了Serializable接口,重写了readObject方法,导致在接下来调用hashCode时,能够成功通过hashCode()方法,一步一步调用URL.getHostAddress,进而发起远程请求触发dnslog。

这篇关于【Java安全】ysoserial-URLDNS链分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684459

相关文章

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例