主要研究Java反序列化。我虽然很喜欢反序列化漏洞,这是我最喜欢的漏洞,没有之一。但是总是基础不够牢固困惑太多。所以干脆一次性解惑。

1.反序列化是什么

  1. 序列化主要是把一个对象变成一个字符串序列<br /> 反序列化则把字符串序列变成一个类对象<br />序列化 反序列化在开发中使用场景是:远程调用或者传输一些函数 方法 一些类避免重新写方法 类。比如传输json数据反序列化成对象,json数据是开发中比较常见的,还有xml数据反序列化成对象。<br /> <br />原生态java 涉及到的类有: <br /> 序列化:ObjectOutputStream writeObject<br /> 反序列化:ObjectInputStream readObject(读取 反序列化对象 恢复序列化对象)<br /> 最后一定要恢复序列化对象才有意义啊。

2.反序列化漏洞是什么

  1. 因为反序列化最后一定会调用readObject 来恢复序列化对象,但是readObject这个类是可以被重写,重写以后可以加一些有危害的代码比如Runtime.getRuntime().exec("calc.exe"); 被调用以后就会产生危害。

整个反序列化产生危害的程序流程:

  1. UnsafeClass类被序列化进object文件
  2. 从object文件中恢复对象
  3. 调用被恢复对象的readObject方法
  4. 命令执行

    那么问题来了 我们怎么控制readObject这个类呢。正常情况下程序员不会自己蠢到重写readObject写有毒代码进去。

3.反序列化调用链(POP Gadgets)

readObject是无法直接控制的,但可以通过反射、动态代理、转换等方法调试最终达到所谓的可控,执行我们的命令。即我们可以找到一个具有可执行命令方法的类 然后去反序列化这个类,将这个类变成我们的输入

Gadgets是小工具的意思,POP Gadgets即为面向属性编程的利用工具、利用链。
当我们确定了可以带入序列化数据的入口后,便是要寻找对应的POP链。以上提到的基础库和框架恰恰提供了可导致命令执行 POP 链的环境,所以引入了用户可控的序列化数据,并使用了不安全的基本库,就意味着存在反序列化漏洞。

利用链思考角度:
Java中执行命令的方式有两种,使用Runtime和使用ProcessBuilder。使用Runtime的语句为Runtime.getRuntime().exec(command),利用的最终过程是执行了这条语句,那么我们反向思维,去构造这条语句并且去寻找哪个函数可以执行这条语句,然后再去找哪个函数可以去调用上面的函数,层层调用,一直到反序列化readObject函数,因为反序列化第一步就会执行readObject函数,正向第一步就是反向的最后一步,具体调试过程我们使用神器ysoserial,ysoserial Github下载地址CommonsCollection1利用链有两种方式,一种是利用LazyMap,一种是TransformedMap,ysoserial的payload是利用LazyMap,反向分析,正向调试并且正反向最后可以拼接上。
image.png

4.反序列化漏洞场景(代码业务场景)

Json 反序列化 JSON.parseObject
xml反序列化 XMLDecoder.readObject
常用类库: Json fastJson Jackson gson
Xstream
模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景

5.反序列化漏洞常见(fastjson ,weblogic)研究

不复现漏洞,看到啥研究啥 (研究调用链 工具 组件 代码层面研究……)

5.1 fastjson

5.1.1 fastjson 序列化与反序列化方式

5.1.1.1 检测fastjson(反序列化漏洞)方式
  • 直接回显 报错回显 不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样
  • 无直接回显 dns报错回显
  • 流量检测 抓包 ACED0005在开头,base64加密后特征可能为rO0AB 或者 ztAA 或者 s7QAF

    5.1.2 fastjson 版本

  • 1.2.24版本 @type 反序列化 setter getter方法导致 反序列化

    1. 我之前一直不明白为啥大家都要用下面这个类 明明可以随便指定,我现在明白了,rce肯定要获取shell嘛。弹个计算器有什么好玩的。。。。{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/POC", "autoCommit":true}<br /> 原理是 com.sun.rowset.JdbcRowSetImpl 这个类在设置 autoCommit setter 时会调用 connect 方法去连接 dataSourceName 指定的 jdbc 服务。 JNDI 常用的有 RMI LDAP 服务,这里我使用的 RMI 服务,因为实现比较简单,这个后面会说。

这个东西的理论危害 实际危害 怎么区别那么大。。。

5.2 weblogic

6.反序列化漏洞工具研究&&使用


7.反序列化漏洞代码审计查找&&修复

参考引用:https://www.cnblogs.com/Fluorescence-tjy/p/11222052.html
https://blog.csdn.net/weixin_44825990/article/details/109270029

这个文章好 https://zhuanlan.zhihu.com/p/99075925
fastjson反序列化:
https://www.cnblogs.com/chengez/p/14789477.html
反序列化检测:https://www.cnblogs.com/alert123/p/5124637.html
https://blog.riskivy.com/%e6%97%a0%e6%8d%9f%e6%a3%80%e6%b5%8bfastjson-dos%e6%bc%8f%e6%b4%9e%e4%bb%a5%e5%8f%8a%e7%9b%b2%e5%8c%ba%e5%88%86fastjson%e4%b8%8ejackson%e7%bb%84%e4%bb%b6/