基础知识点:

 序列化是指把 Java 对象转换为字节序列的过程。Java 反序列化是指把字节序列恢复为 Java 对象的过程;注意这里的反序列化漏洞不仅仅指的是如借助Apache Commons Collections依赖触发的漏洞,还包括json类型转对象,XML类型转对象,YAML类型转对象,SOAP等等

0x01 反序列化漏洞的几种分类:

1 常见类型:Apache Commons Collections  触发方式:构造一个重写了readobject的类,调用TemplatesImpl.getOutputProperties(),Templates中存储了恶意的执行命令的代码,具体实现原理可以读ysoserial的代码进行理解

2 json类型:fastjson,jackson的反序列化漏洞,大部分依赖于JNDI注入

3 yaml以及XML类型: yaml RCE   XMLDecoder RCE 文章:http://www.b1ue.cn/archives/239.html

   xstream  https://www.anquanke.com/post/id/239865#h2-0

……

0x02 反序列化漏洞的回显技术 

常用的回显技术:

        1 写文件 ,执行完命令后读取文件内容

        2 远程加载jar

        3 RMI实例绑定

        4 某些特定的类抛出异常 

        5  基于研究中间件或者框架的请求响应原理,进行动态获取当前请求的参数且将执行命令的结果写入响应

重点说一下基于研究中间件或者框架的请求响应原理:

     POC构造原理 通过动态+静态分析调试,获取存储在公共变量中的Request与Response对象,从请求中拿出参数传递拼接在执行命令的地方,将结果写入Response

0x03 部分反序列化回显实验记录  

    搭建一个spring mvc的环境,写一个继承了Serializable的类,重写readObject方法,(在实际情况中,重写readObject方法往往是JDK自带的类或者第三方库的,然后通过巧妙的构造触发携带有恶意代码的类,并进行了初始化,达到了执行命令的效果)

代码截图:

第一部分:构造恶意的demo类,重写的readobject中,携带了回显的代码(这个回显基于springMVC,经测试搭配shiro框架也可用)

id反序列化 java serializable java反序列化漏洞有哪些_java

接上图:

id反序列化 java serializable java反序列化漏洞有哪些_java_02

第二部分:web部分构造,接受参数,并进行反序列化

id反序列化 java serializable java反序列化漏洞有哪些_Java_03

第三部分:编码demo类

id反序列化 java serializable java反序列化漏洞有哪些_Java_04

验证阶段:

运行setPayload,生成shellcode

rO0ABXNyABdjb20uZGF5Mi5zcHJpbmdtdmMuZGVtb4W2kZallOQKAgACSQADYWdlTAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwAAAAGnQABWFkbWlu

启动springmvc web服务,构造数据包

id反序列化 java serializable java反序列化漏洞有哪些_Java_05

注意,这里只是模拟一下大概的流程,实际上漏洞触发环境比这个复杂多了,真实的环境上需要借助第三方依赖触发,如CommonsCollections系列,并且真实环境构造readobject方法中并没有直接携带执行命令后者执行任意代码的部分,真实的环境往往通过特定的类的readobject方法触发Templates中包裹的恶意代码,达到恶意代码执行的效果,还需要特定的JDK版本;此外,fastjson部分反序列化漏洞触发为JNDI注入(lookup方法,加载恶意的class),这里需要区别一下RMI反序列化漏洞原理(也是lookup方法),RMI反序列化漏洞往往结合CommonsCollections依赖,分为客户端,服务端,注册中心的反序列化漏洞,其触发原理也是构造重写readObject的类