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”字符。但更常见的情况是序列化对象通过其他协议在各种各样的端口上进行传送。这时就需要列出程序监听的端口。

接下来便是利用这些端口。试着找一下程序自带的一些脚本或者命令行工具,以此来用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客户端使用何种协议发包收包,找到序列化对象的位置。

协议大概为:先由CLI客户端发向服务端说明协议类型
从服务端读取请求。接着便可以发送第二个包,包里包含了序列化对象,可以对它们进行替换构造发包。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、背景 2015年11月6日FoxGlove Security安全团队的@breenmachine 发布了一篇长...
    Jewel591阅读 17,072评论 0 4
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 13,740评论 0 24
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 一、 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化de...
    步积阅读 5,268评论 0 10
  • 渐进记号 Θ -- 上界和下界,紧确界,相当于f(n) ∈ [c1 * g(n), c2 * g(n)] Ω --...
    Nautilus1阅读 4,597评论 0 0