首页 > 其他分享 >URLDNS链分析

URLDNS链分析

时间:2024-01-22 18:48:14浏览次数:20  
标签:java URLDNS 链分析 int readObject hashCode key 序列化

一、概述

URLDNS 是ysoserial中利用链的一个名字,通常用于检测是否存在Java反序列化漏洞。该利用链具有如下特点:

不限制jdk版本,使用Java内置类,对第三方依赖没有要求

目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞

URLDNS利用链,只能发起DNS请求,并不能进行其他利用

二、流程图

截图.png

三、原理

java.util.HashMap 重写了 readObject, 在反序列化时会调用 hash 函数计算 key 的 hashCode.而 java.net.URL 的 hashCode 在计算时会调用 getHostAddress 来解析域名, 从而发出 DNS 请求.

四、过程概述

1、HashMap.readObject

在调用readObject方法时添加断点

截图.png

调试到断点位置,步入此步,进入HashMap.readObject

private void readObject(java.io.ObjectInputStream s)
    throws IOException, ClassNotFoundException {
    // Read in the threshold (ignored), loadfactor, and any hidden stuff
    s.defaultReadObject();
    reinitialize();
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new InvalidObjectException("Illegal load factor: " +
                                         loadFactor);
    s.readInt();                // Read and ignore number of buckets
    int mappings = s.readInt(); // Read number of mappings (size)
    if (mappings < 0)
        throw new InvalidObjectException("Illegal mappings count: " +
                                         mappings);
    else if (mappings > 0) { // (if zero, use defaults)
        // Size the table using given load factor only if within
        // range of 0.25...4.0
        float lf = Math.min(Math.max(0.25f, loadFactor), 4.0f);
        float fc = (float)mappings / lf + 1.0f;
        int cap = ((fc < DEFAULT_INITIAL_CAPACITY) ?
                   DEFAULT_INITIAL_CAPACITY :
                   (fc >= MAXIMUM_CAPACITY) ?
                   MAXIMUM_CAPACITY :
                   tableSizeFor((int)fc));
        float ft = (float)cap * lf;
        threshold = ((cap < MAXIMUM_CAPACITY && ft < MAXIMUM_CAPACITY) ?
                     (int)ft : Integer.MAX_VALUE);
        @SuppressWarnings({"rawtypes","unchecked"})
            Node<K,V>[] tab = (Node<K,V>[])new Node[cap];
        table = tab;

        // Read the keys and values, and put the mappings in the HashMap
        for (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);
        }
    }
}

关注putVal方法,putVal是往HashMap中放入键值对的方法,这里调用了hash方法来处理key,跟进hash方法(步入putVal后,单击hash):

2、HashMap.hash

截图.png

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

这里又调用了key.hashcode方法,而key此时是我们传入的 java.net.URL 对象,那么跟进到这个类的hashCode()方法看下

3、URL.hashCode

截图.png

public synchronized int hashCode() {
    if (hashCode != -1)
        return hashCode;

    hashCode = handler.hashCode(this);
    return hashCode;
}

当hashCode字段等于-1时会进行handler.hashCode(this)计算,跟进handler发现,定义是

transient URLStreamHandler handler; // transient 关键字,修饰Java序列化对象时,不需要序列化的属性

跟进java.net.URLStreamHandler#hashCode()

4、java.net.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();
    else
        h += u.getPort();

    // Generate the ref part.
    String ref = u.getRef();
    if (ref != null)
        h += ref.hashCode();

    return h;
}

u 是我们传入的url,在调用getHostAddress方法时,会进行dns查询。

截图.png

五、URL_DNS_POC构造

1、生成序列化文件

package com.mzy.URLDNS;

import java.io.*;

public class Serializable {
    public static void serializable(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("mzy.ser"));
        oos.writeObject(obj);
        oos.close();
    }

    public static void main(String[] args) throws IOException {
        Student student = new Student("mzy",21);
        serializable(student);
    }
}
-----------------------------------------------------

运行此程序会在当前目录生成一个mm.ser的序列化文件

2、反序列化

package com.mzy.URLDNS;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class unSerializable {
    public  static Object unserializable(String Filename) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj= ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Student stu = (Student) unserializable("mm.ser");
        System.out.println(stu);
    }

}
3、实验结果 截图.png

 

六、总结

JDK1.8下的调用路线:

HashMap->readObject()

HashMap->hash()

URL->hashCode()

URLStreamHandler->hashCode()

URLStreamHandler->getHostAddress()

InetAddress->getByName()

标签:java,URLDNS,链分析,int,readObject,hashCode,key,序列化
From: https://www.cnblogs.com/msirboss/p/17980707

相关文章

  • Java反序列化之URLDNS链
    Java反序列化之URLDNS链一、漏洞简介URLDNS链是java原生态的一条利用链,通常用于存在反序列化漏洞进行验证的,因为是原生态,不存在什么版本限制。该链有以下三个特点:不限制jdk版本,使用Java内置类,对第三方依赖没有要求目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞URLD......
  • 中国储能产业链分析二
    储能系统集成商概述将电池系统、PCS、BMS等组件按照不同的应用场景和客户需求组合为一整套储能系统设备,并保证其安全、可靠、高效运行。分两类:①供应链上的生产企业:比如宁德时代,比亚迪,本身就生产电池等部件,然后他们来做集成商,有成本、技术的优势。②专业储能为目标的初创企业......
  • 中国储能产业链分析一
    储能技术主要分为热储能、电储能和氢储能,电储能又分为电化学储能和机械储能(又称物理储能)两大类别。电化学储能中,磷酸铁锂为主的锂电储能最成熟,最广泛。在电化学储能中占比90%,电化学储能中还有钠离子电池储能、液流储能。 锂电储能1.概述截至2021年,全球锂电储能累计装机规模......
  • URLDNS的反序列化调试分析
    Java反序列化(0):URLDNS的反序列化调试分析URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject......
  • ysoserial中的URLDNS利用链代码审计
    ysoserial中的URLDNS利用链代码审计一.避坑我使用了jdk1.8的版本,因为在使用jdk1.7版本的时候出现了如下报错java:程序包sun.rmi.server不存在之后问chatgpt之后我发现不知为什么我的jdk1.7里面没有rt.jar,所以我换成了jdk1.8二.环境搭建1.下载源码https://github.com......
  • Java Commons-Collections链分析
    CC1调用链代码执行的关键点InvokerTransformer.java transform(Objectinput) Classcls=input.getClass();Methodmethod=cls.getMethod(iMethodName,iParamTypes);returnmethod.invoke(input,iArgs);主要靠transform方法用反射的方式执行命令input......
  • Java反序列化:URLDNS的反序列化调试分析
    URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节......
  • 配置和使用APM功能和调用链分析功能
    一、功能概要时速云APM模块即应用性能管理,完美兼容Pinpoint,通过跟踪服务之间的调用来解决微服务监控问题。APM主要从应用性能方面对微服务进行监控和管理,保证业务服务的性能和可靠性。其中,微服务拓扑主要是查看服务间的拓扑,使得服务间的关系不再是一个“黑盒”。可实时了解各服务......
  • JAVA反序列化-URLDNS分析
    目录0x01URLDNS0x02利用链分析本文基于P大的《java安全漫谈》环境jdk1.7urldns是学习JAVA反序列化的入门利用链0x01URLDNSURLDNS就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结......
  • javasec(五)URLDNS反序列化分析
    这篇文章介绍URLDNS就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结果也不是命令执⾏,⽽是⼀次DNS请求。ysoserial打包成jar命令mvncleanpackage-DskipTests,刚刚入门所以用这条链作......