深入浅出谈Java安全之URLDNS链

在学习Java的反序列化漏洞的时候,就不得不学习他的一个利用链。很多刚刚入门的对于利用链这个词可能比较陌生。那么这里先来了解一下Java反序列化和反序列化漏洞的一个产生。

1|20x01 Java反序列化

Java提供了一种对象序列化的机制,用一个字节序列表示一个对象,该字节包含对象的数据、对象的类型、对象的存储属性。字节序列写出到文件后,相当于可以持久报错了一个对象信息,这过程叫做序列化。序列化对象会通过ObjectOutputStreamwriteObject方法将一个对象写入到文件中。

而反序列化是使用了readObject 方法进行读取并还原成在序列化前的一个类。

这一步骤并没有什么安全问题,但是如果反序列化的数据是可控的情况下,那么我们就可以从某个输入点,输入恶意代码,再去查找在哪个点,我们的输入会被一层一层的带去到我们的触发点去,而这一步叫做寻找利用链的步骤。

1|30x02 动态调试ysoserial

 

至于ysoserial就不多叙述了,自行百度。

深入浅出谈Java安全之URLDNS链_第1张图片

看到pom.xml知道该项目是个maven的项目,点击pom.xml 进行刷新,将缺少的依赖给下载下来

深入浅出谈Java安全之URLDNS链_第2张图片

下载完成,直到不爆红了后,就可以开始调试ysoserial了。

先来查找一下该程序的入口点,点开pom.xml搜索mainclass就可以找到入口点的类

深入浅出谈Java安全之URLDNS链_第3张图片

ctrl+左键点击跟踪进去,运行测试一下。

深入浅出谈Java安全之URLDNS链_第4张图片

深入浅出谈Java安全之URLDNS链_第5张图片

运行发现爆了一些错误,这里是因为我们并没有去传入值。

深入浅出谈Java安全之URLDNS链_第6张图片

点击Edit configurations,设置参数

深入浅出谈Java安全之URLDNS链_第7张图片

再次运行就可以看到成功执行了。

深入浅出谈Java安全之URLDNS链_第8张图片

这样我们就获取到了一个序列化的数据。

我们的ysoserial就能在idea里面去运行了。

1|40x03 URLDNS链分析

 

URLDNS是ysoserial里面就简单的一条利用链,但URLDNS的利用效果是只能触发一次dns请求,而不能去执行命令。比较适用于漏洞验证这一块,而且URLDNS这条利用链并不依赖于第三方的类,而是JDK中内置的一些类和方法。

在一些漏洞利用没有回显的时候,我们也可以使用到该链来验证漏洞是否存在,比如shiro反序列化就是使用dnslog来验证漏洞是否存在,(盲猜的,并没有去分析过,后面可以去分析一下)。

下面先来使用ysoserial的URLDNS

 

java -jar .\ysoserial.jar URLDNS "http://2mdw9p.dnslog.cn"

深入浅出谈Java安全之URLDNS链_第9张图片

得到序列化后的数据,如果需要执行,我们需要对其进行反序列化,这里先不执行。先来看看在ysoserial中,该数据是怎么获取的。

打开ysoserial/payloads/URLDNS.java的源码

深入浅出谈Java安全之URLDNS链_第10张图片

上面的注释也写明白了他的调用链

深入浅出谈Java安全之URLDNS链_第11张图片

具体怎么执行的我们还得去debug看。

触发点在hashmap的put方法,我们在put地方打一个断点

深入浅出谈Java安全之URLDNS链_第12张图片

来到hashmap的readobject中看到

深入浅出谈Java安全之URLDNS链_第13张图片

这里使用了hash方法对key的值进行了处理,我们来跟踪一下hash这个方法看看他具体的实现

深入浅出谈Java安全之URLDNS链_第14张图片

这里的key的是java.net.URL的实例对象调用了key的hashcode。再跟进一下他的hashcode方法。

深入浅出谈Java安全之URLDNS链_第15张图片

深入浅出谈Java安全之URLDNS链_第16张图片

在hashcode方法中还调用了handler的hashcode。先来跟踪一下hanler

深入浅出谈Java安全之URLDNS链_第17张图片

调用 URLStreamHandler 的hashcode。进行跟踪URLStreamHandler.hashcode。

深入浅出谈Java安全之URLDNS链_第18张图片

跟进一下getProtocol方法

深入浅出谈Java安全之URLDNS链_第19张图片

在jdk的api文档里面写着该方法是用来获取协议的名称的

回到刚刚的地方

深入浅出谈Java安全之URLDNS链_第20张图片

再来跟踪一下getHostAddress

深入浅出谈Java安全之URLDNS链_第21张图片

来到这里后,可以发现会调用getHostgetByName这两个方法。

JDKapi文档查看 InetAddress.getByName方法

深入浅出谈Java安全之URLDNS链_第22张图片

该方法会使用远程请求,进行获取主机的ip,那么这时候就会触发一次请求,到了这里我们的dnslog平台,就可以收到响应了。这就是这个URLDNS链的一个触发点。

调用链:

 

HashMap.readObject() -> HashMap.putVal() -> HashMap.hash() -> URL.hashCode()->URLStreamHandler.hashCode().getHostAddress ->URLStreamHandler.hashCode().getHostAddress ->URLStreamHandler.hashCode().getHostAddress.InetAddress.getByName

下面来测试一下

 

import java.io.*; public class main { public static void main(String[] args) throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream("out.bin"); ObjectInputStream bit = new ObjectInputStream(fis); bit.readObject(); } }

执行后再看我们的dnslog平台

深入浅出谈Java安全之URLDNS链_第23张图片

在URLDNS里面其实导致反序列化的根本原因是因为hashmap重写了readobject反序列化方法,而重写后的readobject方法调用了putVal导致的一个利用链

 

你可能感兴趣的:(java,安全,spring)