Antifrag

返回

ysoserial(https://github.com/frohoff/ysoserial)

URLDNS源码

该Java类是一个用于payload测试的工具类,实现了ObjectPayload接口,其主要功能是通过构造一个特殊的URL对象并将其放入HashMap中,来触发DNS解析。 具体实现如下: 通过创建一个SilentURLStreamHandler对象来避免DNS解析。 创建一个HashMap对象,并使用URL对象作为键,将URL字符串作为值放入其中。 通过反射重置URL对象的hashCode值,以触发下次调用hashCode时的DNS查找。 返回包含URL的HashMap对象。 该类还包含一个main方法,用于通过PayloadRunner运行该类。 静态内部类SilentURLStreamHandler继承自URLStreamHandler,重写了openConnection和getHostAddress方法,以避免打开连接和获取主机地址时进行DNS解析。

通过调试putVal(hash(key), key, value, false, false);这行进入到hash里面查看hash是如何组成的

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
java

进入hash后我们发现他的值有调用了hashcode我们再次进入到hashcode

public synchronized int hashCode() {
    if (hashCode != -1)
        return hashCode;

    hashCode = handler.hashCode(this);
    return hashCode;
}
java

当hashcode != -1 时,返回hashcode

我们先继续调试

进入到hashCode = handler.hashCode(this);里面的hashCode()函数

在这里我们能看到关键的getHostAddress()函数

我们再次进入到内部

这个函数能够获取到IP地址

当hashcode != -1 时,返回hashcode

我们将hashcode = -1则返回进入hashCode() 则可进入到getHostAddress()

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

DNS查询

整个 URLDNS 的Gadget其实清晰⼜简单:

1. HashMap->readObject()
2. HashMap->hash()
3. URL->hashCode()
4. URLStreamHandler->hashCode()
5. URLStreamHandler->getHostAddress()
6. InetAddress->getByName()
URLDNS审计
https://antifrag.cn/blog/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-urldns%E5%AE%A1%E8%AE%A1
作者 l6kmw
发布于 2024年4月23日