反序列化漏洞研究

最近几周一直在研究java的反序列化漏洞相关问题 我们先来看看这个著名的类和其中的那个方法了

c38b888c61f0cdc83d08c477d2e9cf9612b.jpg

对没错 就是这个大名鼎鼎的readObject方法 一旦黑客发现了"可乘之机"  就会构造一个paylaods比如这个

  private void readObject(java.io.ObjectInputStream stream)
          throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
    ProcessBuilder processBuilder = new ProcessBuilder("whoami");
    Process process = processBuilder.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    StringBuilder out = new StringBuilder();
    while ((line = br.readLine()) != null) {
      out.append(line);
    }
    System.out.println(out);
  }

当然这个paylaods只是执行了whoami这个系统命令 如果是其他的指令 那可就不好玩了

实际任何一个反序列化漏洞的构成都是如此  反序列化漏洞的paylaods里面重写了readObject方法

02d5c8e0ab1a317afa242a1eb1e0be169b6.jpg

我对readObjectStream的类进行了改写注意注释就是改写的地方

    private ObjectStreamClass readNonProxyDesc(boolean unshared)
        throws IOException
    {
        if (bin.readByte() != TC_CLASSDESC) {
            throw new InternalError();
        }

        ObjectStreamClass desc = new ObjectStreamClass();
        int descHandle = handles.assign(unshared ? unsharedMarker : desc);
        passHandle = NULL_HANDLE;

        ObjectStreamClass readDesc = null;
        try {
            readDesc = readClassDescriptor();
        } catch (ClassNotFoundException ex) {
            throw (IOException) new InvalidClassException(
                "failed to read class descriptor").initCause(ex);
        }

        Class<?> cl = null;
        ClassNotFoundException resolveEx = null;
        bin.setBlockDataMode(true);
        final boolean checksRequired = isCustomSubclass();
        try {
            if ((cl = resolveClass(readDesc)) == null) {
                resolveEx = new ClassNotFoundException("null class");
            } else if (checksRequired) {
                ReflectUtil.checkPackageAccess(cl);
            }
        } catch (ClassNotFoundException ex) {
            resolveEx = ex;
        }
        //--------------
        System.out.println(cl);
        Method []m=((Class)cl).getDeclaredMethods();
        for(Method ms:m){
            System.out.println(ms);
            if(ms.toString().contains(".readObject(")){
                System.out.println("HACK!");
                return null;
            }
        }
        //--------------
        skipCustomData();

        desc.initNonProxy(readDesc, cl, resolveEx, readClassDesc(false));

        handles.finish(descHandle);
        passHandle = descHandle;
        return desc;
    }

 

转载于:https://my.oschina.net/9199771/blog/2209373

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值