美文网首页
urldns利用链分析

urldns利用链分析

作者: aaOn1y | 来源:发表于2021-12-18 09:53 被阅读0次

java序列化与反序列化

java 序列化与反序列化 为了更好的存放传输一些数据,往往会将一些数据进行序列化,需 要用到的时候再反序列化获取对象进行操作,在 java 中只要继承 了 Serializable 接口的类就可以被序列化,根据官方文档该类 只作为序列化的标识,不用实现该接口


图片.png

在序列化与反序列化的过程中其实也就是涉及到两个方法
writeObject和readObject,官方文档定义
writeObject方法负责为其特定的类编写对象的状态,以便相应的readObject方法可以恢复它。 可以通过调用out.defaultWriteObject来调用保存对象字段的默认机制。 该方法不需要关注属于其超类或子类的状态。 通过使用writeObject方法或通过使用DataOutput支持的原始数据类型的方法将各个字段写入ObjectOutputStream来保存状态。

readObject方法负责从流中读取并恢复类字段。 它可以调用in.defaultReadObject来调用恢复对象的非静态和非瞬态字段的默认机制。 defaultReadObject方法使用流中的信息将保存在流中的对象的字段分配给当前对象中相应命名的字段。 当处理类进化到添加新字段时,这将处理这种情况。 该方法不需要关注属于其超类或子类的状态。 通过使用writeObject方法或通过使用DataOutput支持的原始数据类型的方法将各个字段写入ObjectOutputStream来保存状态。

关于两种方法的学习

定义一个T00ls类用于序列化操作

import java.io.Serializable;

public class T00ls  implements Serializable {
    private int id;
    private String username;
    private String password;


    @Override
    public String toString() {
        return "T00ls{" +
            "id=" + id +
            ", username='" + username + '\'' +
            ", password='" + password + '\'' +
            '}';
    }
}

定一个serialize类用于序列化T00ls类,生成文件T00ls.ser

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class serialize  {
    public static void main(String[] args) throws Exception  {

        //实例化T00ls类
        T00ls t00ls = new T00ls();
        //创建文件t00ls.ser
        FileOutputStream fileOutputStream = new FileOutputStream("./t00ls.ser");
        //创建object输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //将对象写入到文件t00ls.ser
        objectOutputStream.writeObject(t00ls);
        //关闭obejct输出流
        objectOutputStream.close();

    }
}
图片.png

创建 unserialize类读取t00ls.ser文件反序列化得到对象,打印对象

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class unserialize {
    public static void main(String[] args) throws Exception{


        //创建文件输入流
        FileInputStream fileInputStream = new FileInputStream("./t00ls.ser");
        //创建object输入流
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        //类型转换为t00ls类型
       T00ls o = (T00ls)objectInputStream.readObject();
        System.out.println(o);


    }
}
图片.png

以上就是java序列化与反序列化的过程,java的反序列化漏洞其实就是发生在readObject,
该方法如果被重写时调用了危险的方法就可导致反序列化过程中调用危险方法从而执行一些命令,简单实例在被序列化的类中重写readObject方法:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class T00ls  implements Serializable {
    private int id;
    private String username;
    private String password;



    private void readObject( java.io.ObjectInputStream ob) throws IOException, ClassNotFoundException {
        //执行默认的readObject方法
        ob.defaultReadObject();
        //执行打开计算器程序命令
        Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator");
    }


    @Override
    public String toString() {
        return "T00ls{" +
            "id=" + id +
            ", username='" + username + '\'' +
            ", password='" + password + '\'' +
            '}';
    }
}

反序列化时触发弹出计算器


图片.png

java.net.URL 类

根据官方文档该类继承自Object类实现了Serializable接口

图片.png

根据urldns的公布的利用链,最后是通过URL的hashcode方法触发的dns请求
demo代码:

import java.net.MalformedURLException;
import java.net.URL;

public class test {


    public static void main(String[] args) throws MalformedURLException {

        URL url = new URL("http://4x0cv9.dnslog.cn");

        url.hashCode();

    }

}

执行完成后触发了dns请求


图片.png

在hashcode出打断点进行调试,进入hashcode方法,判断当前的hashcode是否为-1是的话直接返回hashcode,不是的话调用URLStreamhandler的hashCode方法


图片.png

继续跟进handler的hashCode方法,该方法调用了一个getHostAddress方法来处理传进来的url


图片.png

继续跟进getHostAddress,调用了InetAddress的getByName方法,官方文档该方法为解析url的ip地址,也就是触发dns请求的真正方法


图片.png
图片.png

ysoserial URLDNS利用链分析

该工具注释中也给出来具体的链

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

通过利用链可以看出是HashMap类重写了readObject方法是反序列化漏洞触发的前提条件

图片.png

该方法最后调用了putval方法,参数key经过了hash计算

图片.png

跟进hash方法,处理的时候调用了key的hashCode方法,这就很明了了,传入url对象的话就会调用url的hashCode方法触发dns请求


图片.png

ysoserial payload生成过程,生成类为URLDNS.class

图片.png

对该类进行调试,启动主程序GeneratePayload对main方法,在idea 设置中添加参数


图片.png

设置断点开始调试


图片.png
通过命令行获取到加载类名和url
图片.png

获取到加载类URLDNS,创建URLDNS类实例,然后将对象进行序列化


图片.png

进入到getObject方法,就来到了URLDNS类


图片.png
实例化HashMap对象,生成URL对象,将url对象作为key put到hashMap对象
图片.png

进入put方法,调用了hash方法来处理key


图片.png
跟进hash方法,最终调用了key的hashcode方法,也就是传入的url对象的hashCode 触发dns
图片.png
最后通过反射来将hashcode设置为-1,前面说了URL的hashCode等于-1是才会调用URLStreamHandler的hashcode方法
图片.png

相关文章

  • urldns利用链分析

    java序列化与反序列化 java 序列化与反序列化 为了更好的存放传输一些数据,往往会将一些数据进行序列化,需 ...

  • 什么是反序列化?反序列化的过程,原理

    介绍 本篇主要分析java序列化、反序列化的过程,原理,并且通过简化版URLDNS做案例分析利用链原理。 本篇很重...

  • 第30篇 内部资源分析

    “价值链”,“VRIO框架”,这两个东西,都是看清自己的实力,进而制定出好战略的关键。 价值链分析 价值链分析,是...

  • 清华宁向东144-VIRO框架

    1-价值链分析 价值链分析,是了解商业过程的一个基本工具,也是由此发现自己本钱的好工具。所有的企业,包括大学,都要...

  • 8.0周检视第二周(0223-0301)

    本周收获: 1.五力图 利用这个五力图可以较为全面地分析一个行业或者一个具体公司的发展前景。 2.产业链分析图 3...

  • 监控链分析

    此分析只用作学习用途cnzz可以用来统计网页的相关信息,总结来说就是,ip,ua,时间这3个信息,那它是怎么统计的...

  • TOMsInsight的《中国互联网地下产业链白皮书》 网盘下载

    某团队对外售价25000元的一份报告《中国互联网地下产业链分析白皮书》,这本《中国互联网地下产业链分析白皮书》没项...

  • 价值链分析法 | 商业分析工具

    “什么是价值链分析法?” 价值链分析法 是由美国哈佛商学院教授 迈克尔波特提出来的, 是一种寻求确定企业竞争优势的...

  • 系统分析师之业务流程分析法

    业务流程分析法,主要方法有价值链分析法、客户关系分析法、供应链分析法、基于ERP的分析法和业务流程重组等。1、价值...

  • SpringCloud灰度发布

    一: 调用链分析 请求==>网关==>服务Resttemplate调用==>服务请求==>网关==>服务Fegin...

网友评论

      本文标题:urldns利用链分析

      本文链接:https://www.haomeiwen.com/subject/lltgfrtx.html