java反序列化漏洞分析_java反序列化漏洞原理分析

序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,也便于进行网络传输;反序列化即逆过程,由字节流还原成对象。大多数编程语言都提供内置的方法来实现这两个过程。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”字符。但更常见的情况是序列化对象通过其他协议在各种各样的端口上进行传送。这时就需要列出程序监听的端口。

5d431d639688

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

5d431d639688

协议大概为:先由CLI客户端发向服务端说明协议类型

5d431d639688

从服务端读取请求。接着便可以发送第二个包,包里包含了序列化对象,可以对它们进行替换构造发包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值