小楼昨夜又春风,你知ysoserial-Gadget-URLDNS多少?

小楼昨夜又春风,你知ysoserial-Gadget-URLDNS多少?

💡 原文中文,约4400字,阅读约需11分钟。
📝

内容提要

本文介绍ysoserial工具中的URLDNS gadget,用于验证Java反序列化漏洞。它利用Java内置类构造,无需第三方库,通过DNS解析请求判断目标是否存在漏洞。文章详细分析了漏洞原理、复现步骤和代码逻辑,并解释了如何通过重写URLStreamHandler避免重复DNS请求。

🔎

延伸解读

URLDNS的适用场景与限制

URLDNS gadget主要用于验证目标是否存在Java反序列化漏洞,尤其适合无回显场景。它利用DNS解析请求作为判断依据,无需第三方库,因此通用性强。但需注意,它只能证明存在反序列化入口,无法直接执行命令或获取系统权限。若目标网络禁止出站DNS请求,则此方法可能失效。

避免重复DNS请求的技巧

ysoserial通过重写URLStreamHandler的getHostAddress方法返回null,避免在序列化过程中触发DNS解析。反序列化时,由于复写方法未被序列化,会调用原始方法,从而确保DNS请求只在目标反序列化时发生。这一设计既保证了检测的准确性,又避免了本地测试时的干扰。

理解hashCode缓存机制

URL的hashCode默认缓存为-1,但在放入HashMap时会被计算并缓存。ysoserial利用反射将hashCode重置为-1,确保反序列化时重新计算hash,从而触发DNS解析。这一步骤是URLDNS链的关键,理解它有助于深入掌握反序列化漏洞的触发原理。

Q&A

ysoserial中的URLDNS gadget有什么作用?

URLDNS gadget用于验证目标是否存在Java反序列化漏洞,它不能执行命令,但可以通过触发DNS解析请求来判断漏洞是否存在。

为什么URLDNS gadget适合用来验证反序列化漏洞?

因为URLDNS gadget完全使用Java内置类构造,无需第三方库支持,且当目标没有回显时,可以通过观察是否收到DNS解析请求来判断漏洞是否存在。

URLDNS gadget的利用链是怎样的?

利用链为:HashMap->readObject() -> HashMap->hash() -> URL->hashCode() -> URLStreamHandler->hashCode() -> URLStreamHandler->getHostAddress() -> InetAddress->getByName(),最终触发DNS解析。

在URLDNS gadget中,为什么需要将URL的hashCode设置为-1?

因为URL的hashCode默认有缓存值,设置为-1可以确保在反序列化时重新计算hashCode,从而触发DNS解析。

ysoserial中URLDNS gadget如何避免重复的DNS请求?

ysoserial通过重写URLStreamHandler的getHostAddress方法,使其返回null,从而在序列化时避免触发DNS解析,而在反序列化时由于使用的是JDK原始方法,仍会触发DNS解析。

如何复现URLDNS gadget漏洞?

使用ysoserial工具生成URLDNS payload,例如:java -jar ysoserial.jar URLDNS "http://your.dnslog.cn",然后将生成的序列化数据发送给目标,如果目标存在反序列化漏洞,就会收到DNS解析记录。

🏷️

标签

➡️

继续阅读