java审计-反序列化

readObject/writeObject

java在序列化一个对象时,将会调用这个对象中的writeobject方法,参数类型是objectOutputStream,开发者可以将任何内容写入这个stream中,反序列化时,会调用readObject,开发者也可以从中读取出前面写入的内容,并进行处理

ysoserial-URLDNS

gadget chains:利用链

URLDNS是ysoserial中一个利用链的名字,其结果是一次DNS请求

作用

  • 使用java内置的类构造,对第三方库没有依赖
  • 在目标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞

利用链分析

触发反序列化的方法是readObject,为了研究ysoserial中的这个利用链,我们从payload入手,其中写到

public class URLDNS implements ObjectPayload<Object>{
public Object getObject(final String url) throws Exception{
......
HashMap ht = new HashMap();
}
}

可以发现,在getObject中返回的被反序列化的对象是HashMap,因此接下来就是在这里打个断点,跟一下其过程

如何使用ysoserial项目进行调试

打开工程,然后针对缺少的依赖,可以直接点击+号进行添加

接下来看一下pom.xml可以发现主类是

ysoserial.GeneratePayload
img

接下来到这个主类这里进行分析,然后右键点击开始debug,在上面设置一下参数

image-20220406145109791

可以发现已经跑起来了,并且在断点这里停下了
image-20220406145152006

分析

URLDNS的getObject为反序列化的起点,所以来这里进行分析,发现其调用了HasMap(),并且这边注释到会链接到URL

image-20220406145550294

在hashmap函数中,我们首先看看反序列化方法readObject(),而其中比较特殊的点就在这里,在前面所说

The Java URL class has an interesting property on its equals and
* hashCode methods. The URL class will, as a side effect, do a DNS lookup
* during a comparison (either equals or hashCode).

因此我们继续跟进这个函数

image-20220406183653328

可以发现,在hash函数调用了hashcode的方法,并且此时传入我们一开始设定的url

image-20220406193918163

再往下,可以发现这里的handler是指向一个url类的(一开始我在这里下断点,但是初始化debug的时候,也会经过这里,而那个只是在寻找jar包,所以这里的key的属性就不同了,导致后面的handler指向的函数也不同,有很多同名函数)

image-20220406194122333

而此时的handler就会指向URLStreamHandler的hashCode方法,在这个hashcode方法中可以发现调用了getHostAddress

image-20220406194654193

继续跟进,可以发现调用了getByName

InetAddress.getByName(host) 的作⽤是根据主机名,获取其IP地址,在⽹络上其实就是⼀次DNS查询。

image-20220406194859359

总结

这次的Gadget流程如下:
1.HashMap->readObject()
2.HashMap->hash()
3.URL->hashCode()
4.URLStreamHandler->hashCode()
5.URLStreamHandler->getHostAddress()
6.InetAddress->getByName()

poc

知道整条利用链以后,就要学习一下如何编写反序列化exp了,后面再来补坑

Author

vague huang

Posted on

2022-04-04

Updated on

2022-04-06

Licensed under

Comments