赞
踩
作为一个学安全的小白,不会一点java怎么可以呢。之前一天五个小时速通了一遍java,然后就开搞Java安全,发现还有好多不会。这里就简单从基础一些说一下(大佬退让)
首先介绍一下urldns链是干什么的:
urldns链是一个用来检测是否有java反序列化漏洞的反序列化链子。它本身并没有可以rce或者其他的漏洞利用方法,它只是利用反序列化使java进行dns解析,我们可以利用dnslog网站(dnslog.cn)生成一个域名让java解析观察网站是否有回应来判断反序列化是否可以进行,如果有反应我们就可以进一步思考如何进行反序列化漏洞的利用。
urldns链从java类HashMap开始,HashMap是java内部的一个数据结构,从JDK1.2开始就有了,我们利用hashmap类的readobject方法的重载,可以当反序列化的时候进行调用。那就进入hashmap里面看一下
这是hashmap类里面的readObject方法的部分代码(太长了截屏截不下,重要的是最下面的部分)
看到最后一行的putVal函数的调用,进入传参hash(key),key,value。这里定义key是K类型,K类型是代表键的泛型,其定义的数据可以是任何类型,但只能作为map中的键,同理V类型是一个意思。进去看一下hash函数是怎么写的
这里的key类型不能为空,而且要调用key类型的hashcode方法。java很多类都有hashcode方法,就比如这里我们要用到的URL类。
回顾一下,我们的目的是调用URL类的hashcode方法来实现解析域名,我们先顺着思路走下去,我们进去看一下URL类中的hashCode方法
这里的hashcode是URL类中定义的一个private型变量,可以看到这里他有一个判断hashCode方法是不是-1,如果是-1就直接return hashcode,先不管这个,这个会在后面的反射有用。我们想着掉为什么这样就可以呢,我们进入hashcode方法里面看看是怎么写的
这里的getHostAddress方法可以解析域名。获取其ip地址,配合使用dnslog网站看到有没有显示解析后的IP地址。到这里初步的一个思想就大概结束了
我们写一下poc(这里我一直下划线有警告,不知道为什么)
运行之后刷新,这里put时候值对没有什么用,可以随便设置
可以看到运行生成序列就会有解析后的ip地址,这时如果再次运行反序列化代码会由于网站缓存导致反序列化第二次解析没有显示(我这里第一次生成序列就有俩显示,我不清楚为什么但是影响不大,知道的小伙伴可以在评论区说一下呀)。
为什么会这样呢?
因为我们在使用hashmap.put的时候会调用和上面一样的putval函数,进去put函数看一下
和上面完全一样,所以这里使用put方法就会解析域名,解决方法就是先设置hashcode1变量值不为-1,使用put函数把URL类放到hashmap数据结构里面之后再改回-1就不会让使用put函数的时候就进行解析域名
这里就要用到java反射一下
先放poc
这里使用getclass方法获得url的类是什么。后面的Field类用来获得类的字段,方便可以获得类内的成员变量。这里使用getDeclearedField方法获得变量hashCode的值,使用setAccessible方法设置所有成员变量的值都可以被访问,这也方便我们设置hashmap变量的值。
(反序列化代码)
这里再次运行就不会生成序列就解析域名了,大功告成。
今天就写到这里了,java安全还得慢慢学啊
希望大家都能沉得住心慢慢学习呀。文章有问题欢迎大家指出
qq:2912055973,欢迎大家交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。