介绍
Java反序列化漏洞大家应该都非常熟悉了,想必大家手里都有各种各样的利用这类漏洞的工具。其被称为是2015年被低估的“破坏之王”可见其影响之大。Java反序列化漏洞的成因和PHP反序列化漏洞的成因差不多,都是由于程序接收不可信的序列化数据后直接将其反序列化导致的。这又印证了那句老话:一切的输入都是有害的。
Java序列化与反序列化
Java中可以将对象序列化为字节流来方便对象的传输。在Java中很多地方都会用到对象序列化这种技术,我想这大概是Java反序列漏洞危害那么大的一个原因之一吧。在Java中有很多的看似与序列化没关系的东西都使用了序列化。比如一下的一些流行的协议,他们都是基于Java序列化的。
这样也就暴露很多潜在的攻击面。Java中只有实现了java.io.Serializable 或者 java.io.Externalizable接口的类才能被序列化和反序列化.能够被反序列的类通过使用 java.io.ObjectOutputStream 将对象转换为字节流,在通过使用 java.io.ObjectInputStream 将字节流反序列化为对象。而漏洞就发生在将输入的字节流反序列化为对象这一步。和 PHP 的反序列漏洞利用基本一致。我们能控制的有对象的属性,在Java反序列对象的过程中有一些 魔术方法会被调用比如 readObject() readResolve()等。如果某个可被反序列化的类实现了上述的某个方法,我们就有可能可以做到一些有趣的事情。下面来一个简单的Demo加深下理解。假设存在下面这样一个可被反序列化的类,同时该类在程序当前类路径中。
可以看到该类实现了 readObject 方法,在该方法中又调用了Runtime.getRuntime().exec(command) 来执行一条系统命令,其参数为类的一个属性值,而属性值是我们可控的所以我们就能实现一个代码执行了。当然现实中并没有这么直接,而是需要许多条件的,需要利用一些gadgets构造POP链实现一些有趣的事.如果目标应用使用了一些具有漏洞的库那就很简单了,直接上神奇Ysoserial生成payload发送给应用反序列化可以干掉它喽。就像这样
Java消息服务(Java Message Service)
Java 消息服务(Java Message Service,JMS)应用程序接口是一个Java 平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。下面来看看支持JMS的产品。
可以看到JMS这个东西还是很受欢迎的。下面看看JMS的一个基础的运行流程是怎么样的。
其中主要的组成部分有一些几点。
1. JMS Broker :一般作为一个独立的服务运行,用来接受JMS的连接,并存储和分发消息.可以使用任何语言来实现。
2. JMS Client:与Broker交互,生产者/消费者模型,即一个客户端提交消息,一个客户端获取消息。
3. Connect :使用一些特定的协议通信。
4. Session:仅仅在需要管理时使用。
(责任编辑:安博涛)