java反序列化漏洞原理分析

转自:paper.tuisec.win/detail.jsp

序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,也便于进行网络传输;反序列化即逆过程,由字节流还原成对象。大多数编程语言都提供内置的方法来实现这两个过程。Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,类ObjectInputStream类的readObject()方法用于反序列化。

在java读取完字节流后,会判断是否存在用户自定义的“readObject”方法,如果存在的话,就优先使用udf。所以,如果存在一个自定义了“readObject”方法的对象,而这个方法是危险的,比如说执行系统命令,就会导致反序列化后形成威胁。

序列化后为二进制数据,文件开头为“ac ed 00 05 ”,表示序列化吼的java对象开头的两个字节。经base64编码后开头为“rO0AB”

漏洞寻找方法:

反序列化漏洞存在于commons-collections这个java类库中,漏洞和其中的“InvokerTransformer”有关。若程序运行时使用了包含这个类的jar包,则很有可能出现漏洞。

如果序列化对象作为参数或者cookie经http协议传送,它会被base64编码,此时就注意“rO0AB”字符。但更常见的情况是序列化对象通过其他协议在各种各样的端口上进行传送。这时就需要列出程序监听的端口。

java反序列化漏洞原理分析_第1张图片
接下来便是利用这些端口。试着找一下程序自带的一些脚本或者命令行工具,以此来用Wireshark观察发包收包,像是Jenkins, WebLogic, WebSphere等等都有相应的传送序列化对象的命令行工具。

从github下载工具“ysoserial”,运行生成对应payload。

java -jar /path/to/ysoserial-0.0.2-SNAPSHOT-all.jar CommonsCollections1'touch /tmp/pwned'> payload.out

然后使用payload取代对应包中的序列化对象来构造发包。

使用wirshark抓包,观察CLI客户端使用何种协议发包收包,找到序列化对象的位置。

java反序列化漏洞原理分析_第2张图片
协议大概为:先由CLI客户端发向服务端说明协议类型
java反序列化漏洞原理分析_第3张图片
从服务端读取请求。接着便可以发送第二个包,包里包含了序列化对象,可以对它们进行替换构造发包。

你可能感兴趣的:(java反序列化漏洞原理分析)