转自: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”字符。但更常见的情况是序列化对象通过其他协议在各种各样的端口上进行传送。这时就需要列出程序监听的端口。
从github下载工具“ysoserial”,运行生成对应payload。
java -jar /path/to/ysoserial-0.0.2-SNAPSHOT-all.jar CommonsCollections1'touch /tmp/pwned'> payload.out
然后使用payload取代对应包中的序列化对象来构造发包。
使用wirshark抓包,观察CLI客户端使用何种协议发包收包,找到序列化对象的位置。