基础知识点:
序列化是指把 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框架也可用)
接上图:
第二部分:web部分构造,接受参数,并进行反序列化
第三部分:编码demo类
验证阶段:
运行setPayload,生成shellcode
rO0ABXNyABdjb20uZGF5Mi5zcHJpbmdtdmMuZGVtb4W2kZallOQKAgACSQADYWdlTAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwAAAAGnQABWFkbWlu
启动springmvc web服务,构造数据包
注意,这里只是模拟一下大概的流程,实际上漏洞触发环境比这个复杂多了,真实的环境上需要借助第三方依赖触发,如CommonsCollections系列,并且真实环境构造readobject方法中并没有直接携带执行命令后者执行任意代码的部分,真实的环境往往通过特定的类的readobject方法触发Templates中包裹的恶意代码,达到恶意代码执行的效果,还需要特定的JDK版本;此外,fastjson部分反序列化漏洞触发为JNDI注入(lookup方法,加载恶意的class),这里需要区别一下RMI反序列化漏洞原理(也是lookup方法),RMI反序列化漏洞往往结合CommonsCollections依赖,分为客户端,服务端,注册中心的反序列化漏洞,其触发原理也是构造重写readObject的类