Java安全之URLDNS链

0x00 前言

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

文章首发:Java安全之URLDNS链

0x01 Java反序列化

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

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

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

0x02 动态调试ysoserial

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

ysoserial项目地址:ysoserial

拉取项目源码,导入到IDEA中。

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

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

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

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

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

点击Edit configurations,设置参数

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

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

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

0x03 URLDNS链分析

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

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

下面先来使用ysoserial的URLDNS

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

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

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

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

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

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

来到hashmap的readobject中看到

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

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

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

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

跟进一下getProtocol方法

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

回到刚刚的地方

再来跟踪一下getHostAddress

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

JDKapi文档查看 InetAddress.getByName方法

该方法会使用远程请求,进行获取主机的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平台

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

参考文章

https://www.cnblogs.com/kuaile1314/p/13690210.html
https://www.cnblogs.com/ph4nt0mer/p/11994384.html
https://www.cnblogs.com/v1ntlyn/p/13549991.html
https://zhuanlan.zhihu.com/p/30045174
https://www.cnblogs.com/litlife/p/12596286.html

0x04 结尾

其实调试URLDNS这条链相对来说是比较简单的,虽然前面也花了不少时间去摸索,参考了大量的文章。但是等明白了后,发现其实URLDNS链还是比较简单的。

Java安全之URLDNS链的更多相关文章

  1. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  2. Java安全之C3P0链利用与分析

    Java安全之C3P0链利用与分析 0x00 前言 在一些比较极端情况下,C3P0链的使用还是挺频繁的. 0x01 利用方式 利用方式 在C3P0中有三种利用方式 http base JNDI HEX ...

  3. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  4. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. Java设计模式之责任链设计模式

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...

  6. java开发中的链式思维 —— 设计一个链式过滤器

    概述 最近在弄阿里云的sls日志服务,该服务提供了一个搜索接口,可根据各种运算.逻辑等表达式搜出想要的内容.具体语法可见https://help.aliyun.com/document_detail/ ...

  7. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  8. Java设计模式之职责链设计模式

    1.什么是-职责链设计模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  9. Java设计模式---ChainOfResponsibility责任链模式

    参考于 : 大话设计模式 马士兵设计模式视频 代码参考于马士兵设计模式视频 写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 图来自大话设计模式,下面我的代 ...

随机推荐

  1. 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

    一:背景 1. 讲故事 前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton,Transient, ...

  2. 【洛谷日报#26】GCC自带位运算系列函数

    文章转自 洛谷 谈到GCC的黑科技,大家想到的一定是这句: #pragma GCC optimize (3)//吸氧 抑或是这句: #pragma GCC diagnostic error " ...

  3. 万字长文,Python数据分析实战,使用Pandas进行数据分析

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  4. Codeforces Round #560 (Div. 3)A-E

    A. Remainder output standard output You are given a huge decimal number consisting of nn digits. It ...

  5. Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】

    不管你是否意识到,在这几年时间里,技术岗招聘重点关注的是Docker.Kubernetes(以下简称: K8S),面试10家公司得有8家会问你会不会"docker"."k ...

  6. JVM学习第二天(垃圾回收器和内存分配策略)大章

    说道垃圾回收器大家应该都会有所了解,GC白,当然说道具体的可能就不是很清楚了,今天我们就来玩一玩; GC要做的事情: 第一步:确定堆中需要回收的对象; 第二步:什么时候回收; 第三步:怎样回收 为什么 ...

  7. WebApi OAuth2身份认证

    一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证). ...

  8. css3渐变色实现小功能 ------ css(linaer-gradient)

    由沿直线两种或多种颜色之间的渐进转换的图像.它的结果是数据类型的对象,这是一种特殊的类型. 与任何梯度一样,线性梯度没有内在维度 ; 即,它没有天然或优选的尺寸,也没有优选的比例.其具体尺寸将与其适用 ...

  9. C016:字符串倒置

    代码: #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { c ...

  10. jenkins打包前端项目报 error: index-pack died of signal 15 问题解决

    jenkins打包前端项目报 error: index-pack died of signal 15 问题解决 前几天用jenkins打包一个前端项目的时候出现了 error: index-pack ...