主要研究Java反序列化。我虽然很喜欢反序列化漏洞,这是我最喜欢的漏洞,没有之一。但是总是基础不够牢固困惑太多。所以干脆一次性解惑。
1.反序列化是什么
序列化主要是把一个对象变成一个字符串序列<br /> 反序列化则把字符串序列变成一个类对象<br />序列化 反序列化在开发中使用场景是:远程调用或者传输一些函数 方法 一些类避免重新写方法 类。比如传输json数据反序列化成对象,json数据是开发中比较常见的,还有xml数据反序列化成对象。<br /> <br />原生态java类 涉及到的类有: <br /> 序列化:ObjectOutputStream writeObject<br /> 反序列化:ObjectInputStream readObject(读取 反序列化对象 恢复序列化对象)<br /> 最后一定要恢复序列化对象才有意义啊。
2.反序列化漏洞是什么
因为反序列化最后一定会调用readObject 来恢复序列化对象,但是readObject这个类是可以被重写,重写以后可以加一些有危害的代码比如Runtime.getRuntime().exec("calc.exe"); 被调用以后就会产生危害。
整个反序列化产生危害的程序流程:
- UnsafeClass类被序列化进object文件
- 从object文件中恢复对象
- 调用被恢复对象的readObject方法
命令执行
那么问题来了 我们怎么控制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,反向分析,正向调试并且正反向最后可以拼接上。
4.反序列化漏洞场景(代码业务场景)
Json 反序列化 JSON.parseObject
xml反序列化 XMLDecoder.readObject
常用类库: Json fastJson Jackson gson
Xstream
模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景
5.反序列化漏洞常见(fastjson ,weblogic)研究
5.1 fastjson
5.1.1 fastjson 序列化与反序列化方式
5.2 weblogic
6.反序列化漏洞工具研究&&使用
7.反序列化漏洞代码审计查找&&修复
参考引用:https://www.cnblogs.com/Fluorescence-tjy/p/11222052.html
https://blog.csdn.net/weixin_44825990/article/details/109270029
fastjson反序列化:
https://www.cnblogs.com/chengez/p/14789477.html