【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。

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

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

相关文章

第二篇:MySQL安装与配置(基于小皮面板(phpstudy))

在第一篇中介绍了数据库的相关概念,了解到SQL是用来操作数据库管理系统的语言,因此要学习数据库技术,数据库管理系统的配备是必不可少的! 并且出于流行性与实惠性的双考量而选择MySQL这款数据库管理系统软件 一,工具推…

JVM工作原理与实战(三十六):GraalVM虚拟机

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、GraalVM介绍 二、GraalVM的两种运行模式 三、GraalVM应用场景 1.GraalVM存在的问题 2.GraalVM企业级应用-Serverless架构 3.Serverless架构-函数计算 4.Serverless架构-Serve…

zabbix配置自动发现

1.准备一台新的主机,安装相关软件包。 [rootsishi ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm [rootsishi ~]# yum -y install zabbix-agent2.修改zabbix-agent端的配置文件 [rootsishi ~]# vim /etc/z…

想不让进程停止或者让进程在后台运行

https://www.cnblogs.com/mingyue5826/p/11572228.html nohup:这代表“no hang up”(不挂断)。这是一个Unix命令,用于在后台运行另一个命令,并且不受挂断影响,这意味着即使关闭了终端会话,它仍…

网易腾讯面试题精选----90道设计模式面试题及答案

介绍 设计模式是软件开发的重要组成部分,为常见设计问题提供经过验证的解决方案。就设计模式面试候选人可以帮助衡量他们对软件架构的理解、解决问题的能力以及编写可维护和可扩展代码的能力。以下是一些常见的设计模式面试问题和答案,可帮助评估候选人在该领域的知识和专业知…

TS项目实战二:网页计算器

使用ts实现网页计算器工具,实现计算器相关功能,使用tsify进行项目编译,引入Browserify实现web界面中直接使用模块加载服务。   源码下载:点击下载 讲解视频 TS实战项目四:计算器项目创建 TS实战项目五:B…

当AGI遇到人形机器人

为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人,它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的,例如门、楼梯、桌椅、开关等…

【数据分享】1929-2023年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 之前我们分享过1929-2023年全球气象站点的逐月平均气温数据、逐月最高气温数据…

【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024) 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 第五届大数据、人工智能与软件工程国际研讨会&…

年假作业4

AACBB DACBDD DACBC DBDCA ADBAD #include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { int i,j; int temp; int arr[10]; for( i0;i<10;i) { printf("请输入第%d个数",i1); …

【lvgl】esp32移植lvgl

文章目录 一、环境二、抓取代码三、切换分支四、配置芯片信息五、编译异常问题1: 未定义宽高问题2: 修改接口问题3: lv_mem_size问题4&#xff1a;头文件命名打开配置问题5&#xff1a;缺少font12 六、配置引脚问题6&#xff1a;显示花屏&#xff0c;字符不清 七、测试demo八、…

Ubuntu23.04编译VLC3.0.20的各种错误处理

Ubuntu23.04编译VLC3.0.20的注意事项 重要的事情说在前面&#xff1a;自己搭建VLC的编译环境很难成功&#xff0c;我自己从头搭建重试了很多很多次&#xff0c;只有一次编译出来了&#xff0c;而且只编译出来了VLC本体&#xff0c;没有Web插件等。官方的wiki也很长时间没更新了…

Java大致面试题及答案,文档格式为md格式

# **Java面向对象有哪些特征&#xff0c;如何应用**​ 面向对象编程是利用类和对象编程的一种思想。万物可归类&#xff0c;类是对于世界事物的高度抽象 &#xff0c;不同的事物之间有不同的关系 &#xff0c;一个类自身与外界的封装关系&#xff0c;一个父类和子类的继承关…

vscode连接ssh报错

关于vscode更新版本至1.86后&#xff0c;导致无法连接服务器问题的记录 原因&#xff1a;vscode1.86更新了对glibc的要求&#xff0c;需要最低2.28版本&#xff0c;导致各种旧版本的linux发行版&#xff08;比如最常见的centos 7&#xff09;都无法用remote-ssh来连接了&#…

Windows11安装运行Linux(Ubuntu)

一、安装windows支持 输入windows打开界面 选择虚拟机监控程序平台、适用于linux的子系统、虚拟机平台 在 Windows 系统中&#xff0c;"虚拟机平台"和"虚拟机监控程序平台"是两个与虚拟化相关的功能&#xff0c;但它们各自有着不同的作用和用途。 虚拟机…

springboot(ssm船运物流管理系统 在线物流管理系统Java系统

springboot(ssm船运物流管理系统 在线物流管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&a…

【ArcGIS微课1000例】0101:删除冗余节点或折点

文章目录 一、实验描述二、实验数据三、实验过程1. 手动删除2. 简化线工具四、注意事项一、实验描述 矢量数据获取通常来源于手动或者ArcScan自动采集,其基本存储方式就是记录每个要素的点坐标,如点要素就是一个坐标、线要素由多个点要素连接形成。当某段线要素被过多的节点…

计算机网络的形成和发展

计算机网络的形成和发展 一、早期的计算机网络 1、1951年&#xff0c;美国麻省理工学院林肯实验室就开始为美国空军设计称为 SAGE 的半自动化地面防空系统&#xff0c;该系统最终于1963年建成&#xff0c;被认为是计算机和通信技术结合的先驱。 2、美国航空公司与 IBM公司在…

thinkphp数据批量提交(群发消息)

<form id="edit-form" class="form-horizontal" role="form" data-toggle<

【力扣】罗马数字转整数,哈希集合+模拟

罗马数字转整数原题地址 方法一&#xff1a;模拟 罗马数字是字符串&#xff0c;其中每个字符都对应一个整数值&#xff0c;为了方便查找&#xff0c;可以预先把这种对应关系存储到哈希表中。 遍历字符串&#xff0c;对于每个字符&#xff0c; 如果该字符不是最右边的字符&a…