• jQuery火箭图标返回顶部代码


    简述

    ysoserial很强大,花时间好好研究研究其中的利用链对于了解java语言的一些特性很有帮助,也方便打好学习java安全的基础,刚学反序列化时就分析过commoncollections,但是是跟着网上教程,自己理解也不够充分,现在重新根据自己的调试进行理解,这篇文章先分析URLDNS

    利用链分析:

     

    调用链如上图所示,由hashmap的key进行hash计算时,如果key为URL类的对象,则调用key.hashcode实际为调用了URL类对象的hashcode,从而触发dns解析,这个手写exp也比较容易,设置hashCode为1为了putval时候重新计算hash,否则直接返回hashCode就触发不了dns解析了

    工具介绍

    IDEA

    ysoserial jar : https://jitpack.io/com/github/frohoff/ysoserial/master-30099844c6-1/ysoserial-master-30099844c6-1.jar

    ysoserial 源码:https://codeload.github.com/frohoff/ysoserial/zip/master

    使用:

    ysoserial 是生成反序列化利用数据,就是序列化的数据,而我们的x.txt中就是就是我们的序列化数据

     

     接下来我们对x.txt进行反序列化操作:

    package Reflect;
    import java.io.*;
    public class readobject {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ObjectInputStream o = new ObjectInputStream(new FileInputStream("C:/users/kuaile/desktop/x.txt"));
            Object o1 = o.readObject();
            System.out.println(o1);
        }
    }

     查看我们的dnslog

     倒着来分析,为什么能够发起dns请求,来看urldns类文件

     

    首先yso会调用getobjct方法,

    URLStreamHandler,引用别人对这个类的理解。

          一般而言, URL 的格式是: protocol://[authority]hostname:port/resource?queryString 。 URL 类能够解析出 protocol、 hostname 、 port 等信息。 Protocol 决定了交互规范,通用的协议,比如 HTTP 、 File 、 FTP 等协议, JDK 自带了默认的通讯实现。当然,自定义实现是允许的。 Hostname 和 port 一般用于 Socket 或者基于 Socket 其他协议通讯方式。Resource 即资源上下文。可能读者利用 URL ,通过指定协议( protocol )来获取指定资源的读写,比如 JDK 内置了HTTP 、 File 、 FTP 等协议的处理方法。

          在成功地构造 URL 实例之后, URL API 中定义了一个 openConnection() 方法,返回一个 java.net.URLConnection 抽象类型的实例。不过,这里 URL 对象是代理对象,实际调用的是, java.net.URLStreamHandler 对象的 openConnection() 方法。

    然后实例化了hashmap类,跟进去可以看到,有序列化接口,那就搜索readobject方法

     

    看了一下他反序列化的代码,

    调用putVal方法,进行hash计算

    先跟一下hash方法,参数为key, 如果key 是 null 就返回0 否则就返回 hashcode方法处理后的值和h右移再进行亦或

     

     因为key是java.net.URL对象,我们的key值就是我们的url,就可以跟进一下其中url类的hashcode方法

     判断hashcode 不等于-1 就返回,如果等于-1 就handler.hashcode,跟一下

    调用了我们URL对象,

    继续跟下getHostAddress方法:
     

    其中InetAddress.getByName(host); 

    含义就是相当于进行了一次dns请求

     DEBUG跟了一下,

    最后是再ser就是我们反序列化的值

  • 相关阅读:
    [Practical Git] Clean up commits with git rebase
    [Practical Git] Show who changed a line last with git blame
    [Practical Git] Compare file changes with git diff
    [Practical Git] Filter commit history with git log arguments
    [Practical Git] Format commit history with git log arguments
    [Practical Git] Navigate git command pager output with Unix less commands
    [Practical Git] Switching between current branch and last checkout branch
    [ES6] ES6 Parameter Object Destructuring with Required Values
    [React] Higher Order Components (replaces Mixins)
    HDU 1242 Rescue (BFS(广度优先搜索))
  • 原文地址:https://www.cnblogs.com/kuaile1314/p/13690210.html
Copyright © 2020-2023  润新知