java反序列化-URLDNS链

发布时间:2022-06-25 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java反序列化-URLDNS链脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

ysoserial

ysoserial是一个可以生成反序列化payload的工具,它可以让用户根据自己选择的利用链,生成反序列化利用数据,通过将这些数据发送给目标,从而执行用户预先定义的命令,用法:

点击查看代码
$  java -jar ysoserial.jar
Y SO SERIAL?
Usage: java -jar ysoserial.jar [payload] '[command]'
  Available payload types:
     Payload             Authors                     Dependencies
     -------             -------                     ------------
     AspectJWeaver       @Jang                       aspectjweaver:1.9.2, commons-collections:3.2.2
     BeanShell1          @pwntester, @cschneider4711 bsh:2.0b5
     C3P0                @mbechler                   c3p0:0.9.5.2, mchange-commons-java:0.2.11
     Click1              @artsploit                  click-nodeps:2.3.0, javax.servlet-api:3.1.0
     Clojure             @JackOfMostTrades           clojure:1.8.0
     CommonsBeanutils1   @frohoff                    commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2
     CommonsCollections1 @frohoff                    commons-collections:3.1
     CommonsCollections2 @frohoff                    commons-collections4:4.0
     CommonsCollections3 @frohoff                    commons-collections:3.1
     CommonsCollections4 @frohoff                    commons-collections4:4.0
     CommonsCollections5 @matthias_kaiser, @jasinner commons-collections:3.1
     CommonsCollections6 @matthias_kaiser            commons-collections:3.1
     CommonsCollections7 @scristalli, @hanyrax, @EdoardoVignati commons-collections:3.1
     FileUpload1         @mbechler                   commons-fileupload:1.3.1, commons-io:2.4
     Groovy1             @frohoff                    groovy:2.3.9
     Hibernate1          @mbechler
     Hibernate2          @mbechler
     JBossInterceptors1  @matthias_kaiser            javassist:3.12.1.GA, jboss-interceptor-core:2.0.0.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
     JRMPClient          @mbechler
     JRMPListener        @mbechler
     JSON1               @mbechler                   json-lib:jar:jdk15:2.4, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2, commons-lang:2.6, ezmorph:1.0.6, commons-beanutils:1.9.2, spring-core:4.1.4.RELEASE, commons-collections:3.1
     JavassistWeld1      @matthias_kaiser            javassist:3.12.1.GA, weld-core:1.1.33.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
     Jdk7u21             @frohoff
     Jython1             @pwntester, @cschneider4711 jython-standalone:2.5.2
     MozillaRhino1       @matthias_kaiser            js:1.7R2
     MozillaRhino2       @_tint0                     js:1.7R2
     Myfaces1            @mbechler
     Myfaces2            @mbechler
     ROME                @mbechler                   rome:1.0
     Spring1             @frohoff                    spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE
     Spring2             @mbechler                   spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2
     URLDNS              @gebl
     Vaadin1             @kai_ullrich                vaadin-server:7.7.14, vaadin-shared:7.7.14
     Wicket1             @jacob-baines               wicket-util:6.23.0, slf4j-api:1.6.4

因为该项目里面就包含了URLDNS的payload生成类,可以用该项目调试分析URLDNS链

URLDNS

URLDNS链是一条检测链,因为不能“利用”的原因,他只能进行一次DNS请求,并不能执行命令,但因为其如下的优点,非常适合我们在检测反序列化漏洞时使用: - 使用Java内置的类构造,对第三方库没有依赖 - 在目标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞

通过ysoserial项目分析URLDNS调用链

下载源码,然后用Intellij IDEA打开,等待maven依赖加载完毕(需要一段时间),找到pom.xml文件,找到项目入口主类GeneratePayload.java

java反序列化-URLDNS链

然后找到ysoserial.payloads.URLDNS.java类,该类可以生成这条链的payload,首先在注释就可以看到利用链

java反序列化-URLDNS链

然后看到getObject方法,ysoserial会调⽤用这个方法获得 Payload,这个方法返回的是一个对象,这个对象就是最后将被序列化的对象,在这里是HashMap

java反序列化-URLDNS链

而HashMap也就是该链的关键,因为实现了Serializable接口,有readObject方法,看到HashMap的readObject方法

点击查看代码
private void readObject(ObjectInputStream s)
        throws IOException, ClassNotFoundException {

        ObjectInputStream.GetField fields = s.readFields();

        // Read loadFactor (ignore threshold)
        float lf = fields.get("loadFactor", 0.75f);
        if (lf <= 0 || Float.isNaN(lf))
            throw new InvalidObjectException("Illegal load factor: " + lf);

        lf = Math.min(Math.max(0.25f, lf), 4.0f);
        HashMap.UnsafeHolder.putLoadFactor(this, lf);

        reinitialize();

        s.readInt();                // Read and ignore number of buckets
        int mappings = s.readInt(); // Read number of mappings (size)
        if (mappings < 0) {
            throw new InvalidObjectException("Illegal mappings count: " + mappings);
        } else if (mappings == 0) {
            // use defaults
        } else if (mappings > 0) {
            float fc = (float)mappings / lf + 1.0f;
            int cap = ((fc < DEFAULT_INITIAL_CAPACITY) ?
                       DEFAULT_INITIAL_CAPACITY :
                       (fc >= MAXIMUM_CAPACITY) ?
                       MAXIMUM_CAPACITY :
                       tableSizeFor((int)fc));
            float ft = (float)cap * lf;
            threshold = ((cap < MAXIMUM_CAPACITY && ft < MAXIMUM_CAPACITY) ?
                         (int)ft : Integer.MAX_VALUE);

            // Check Map.Entry[].class since it's the nearest public type to
            // what we're actually creating.
            SharedSecrets.getJavaOISAccess().checkArray(s, Map.Entry[].class, cap);
            @SuppressWarnings({"rawtypes","unchecked"})
            Node<K,V>[] tab = (Node<K,V>[])new Node[cap];
            table = tab;

            // Read the keys and values, and put the mappings in the HashMap
            for (int i = 0; i < mappings; i++) {
                @SuppressWarnings("unchecked")
                    K key = (K) s.readObject();
                @SuppressWarnings("unchecked")
                    V value = (V) s.readObject();
                putVal(hash(key), key, value, false, false);
            }
        }
    }

这里调用的hash方法

java反序列化-URLDNS链

继续跟入发现又调用的key对象的hashCode方法

java反序列化-URLDNS链

URLDNS 中使用的这个key是一个java.net.URL对象,看看其hashCode 方法发现又调用了handler的hashCode方法:

java反序列化-URLDNS链

继续跟进:

java反序列化-URLDNS链

再跟进getHostAddress方法:

java反序列化-URLDNS链

发现是URL类里的getHostAddress方法的调用,再跟进一步:

java反序列化-URLDNS链

InetAddress.getByName(host)的作用是根据主机名,获取其IP地址,在网络上其实就是一次DNS查询,这也就是这条链的触发点

因此这条链跟到这里就结束了,调用链如下: 1. HashMap->readObject() 2. HashMap->hash() 3. URL->hashCode() 4. URLStreamHandler->hashCode() 5. URLStreamHandler->getHostAddress() 6. InetAddress->getByName()

实际测验

编写如下代码:

点击查看代码
import java.net.URL;
import java.util.HashMap;

public class Demo{
    public static void main(String[] args) throws Exception {
        HashMap<URL, String> hashMap = new HashMap<URL, String>();
        URL url = new URL("http://yiaho.ygzip5.dnslog.cn");//dnslog.cn平台新建链接
        url.hashCode();
    }
}
在HashCode这里打下断点,开始调试 ![image](https://img2022.cnblogs.com/blog/2192180/202205/2192180-20220508170656658-1170693459.png)

首先进入hashCode函数,调用的URLStreamHandler里的hashCode函数

java反序列化-URLDNS链

然后来到URLStreamHandler类的hashCode函数调用getHostAddress函数

java反序列化-URLDNS链

连续跟进,最后再URL类的getHostAddress函数下调用了InetAddress.getByName

java反序列化-URLDNS链

java反序列化-URLDNS链

此时查看dnslog就会看到一次访问记录

参考文章:p神的java安全漫谈

脚本宝典总结

以上是脚本宝典为你收集整理的java反序列化-URLDNS链全部内容,希望文章能够帮你解决java反序列化-URLDNS链所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: