Ttoc's blog

必须从过去的错误学习教训,而非依赖过去的成功。

0%

上一篇反序列化文章主要分析wirteObjectreadObject这两个方法,

知道了序列化和反序列化的过程,漏洞形成的原因主要就是因为服务端进行反序列化数据时,会自动调用类中的readObject代码,这样就使得攻击者可以在服务器上执行一些恶意代码。

大致有四种情况会导致反序列化形成,

  • 入口类(主类)重写readObject方法,直接调用危险函数
  • 入口类的参数中包含可控类,该类中存在危险函数,readObject时调用
  • 入口类参数中包含可控类,该类调用其他有危险方法的类,readObject时进行调用
  • 构造函数/静态代码块等类加载时隐式执行

而入口类必须调用Serializable接口,不然该类无法被实例化,并且重写了readObject,可以构造利用链。

这篇讲述URLDNS,一步步学习,再学习cc链。

阅读全文 »

终于开始反序列化开篇,之前再RMI的攻击和流程中发现,大多数的数据发送和接收都是反序列化数据。

那么,为什么反序列化常常会带来安全隐患?

一门成熟的语言,如果需要在网络上传递信息,通常会用到一些格式化数据,

比如:

  • JSON
  • XML

但这两个数据格式都有一个共 同的问题:不支持复杂的数据类型。 大多数处理方法中,JSON和XML支持的数据类型就是基本数据类型,整型、浮点型、字符串、布尔 等,如果开发者希望在传输数据的时候直接传输一个对象,那么就不得不想办法扩展基础的 JSON(XML)语法。

比如,Jackson和Fastjson这类序列化库,在JSON(XML)的基础上进行改造,通过特定的语法来传递对象;亦或者如RMI,直接使用Java等语言内置的序列化方法,将一个对象转换成一串二进制数据进行 传输。

不管是Jackson、Fastjson还是编程语言内置的序列化方法,一旦涉及到序列化与反序列化数据,就可 能会涉及到安全问题。但首先要理解的是,“反序列化漏洞”是对一类漏洞的泛指,而不是专指某种反序 列化方法导致的漏洞,比如Jackson反序列化漏洞和Java readObject造成的反序列化漏洞就是完全不同 的两种漏洞。

我们先来说说Java内置的序列化方法readObject,和其有关的漏洞

阅读全文 »

RMI2中成功实现了codebase进行加载恶意类,但是在实际环境确实难实现符合环境,所以只作为一个了解和认识。

这篇文章主要分析codebase是如何在RMI中进行传递的,以及对分析Java序列化数据的工具SerializationDumper的使用介绍

阅读全文 »

从RMI第一篇描述了RMI的通信过程和组成成分,总结一下,一个RMI过程有以下三个参与者:

  • RMI Registry
  • RMI Server
  • RMI Client

但是对于RMI Registry来说,一般在创建时,就直接和服务器端的一个对象进行绑定,所以最后只有Server和Client两部分代码,而Server中就自然包含了Registry和Server两部分:

1
2
LocateRegistry.createRegistry(1099);
Naming.bind("rmi://127.0.0.1:1099/Hello", new RemoteHelloWorld());

上述代码中,第一行是创建并运行RMI Registry,第二行是将RemoteHelloWorld对象绑定到Hello这个Name上。

Naming.bind的第一个参数是url,格式为rmi://host:post/name。这里的hostpost就是RMI Registry的地址和端口,name就是远程对象绑定的名字。

不过,如果RMI Registry在本地运行,那么hostport可以省略的,host默认为localhostport默认是1099

直接保留name就行,

1
Naming.bind("Hello",new RemoteHelloWorld());

第一篇大致讲了RMI整体的原理和流程,那么接下来自然要想到RMI会有哪些安全问题,可以分为两个方向

  • 如果我们能够访问RMI Registry,将如何对其进行攻击?
  • 如果我们可以控制目标RMI客户端中的Naming.lookup的第一个参数,也就是RMI Registry的地址和端口,能不能进行攻击?
阅读全文 »

熟悉的名字,在CVE学习中,其中Apache solrlog4j漏洞和weblogic远程代码执行都提到了RMI,作用如名, RMI(remote method invocation)远程方法调用

阅读全文 »

  1. Java执行命令的方法ProcessBuilder
  2. 反射中使用getConstructor获取构造有参构造函数
  3. 可变长参数(varargs)在反射中的意义与使用
  4. getDeclared系列反射函数和普通反射的区别于使用

并解决第二篇的两个问题,

  • 如果一个类没有无参构造方法,也没有类似单例模式里的静态方法,我们怎样通过反射实例化该类呢?
  • 如果一个方法或构造方法是私有方法,我们是否能执行它呢?
阅读全文 »

本来想将p神的JavaScript污染链文章并在我写的基础浅入里,但是感觉还是得分开学习记录,p神干货还得和我水的文章分开,浅入就讲概念理解学习吧,深入就涉及深入认识污染了

阅读全文 »