点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

作者 |  nice0e3

来源 |  urlify.cn/6Zfiiu

前言

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

1、Java反序列化

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

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

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

2 、动态调试ysoserial

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

ysoserial项目地址:ysoserial

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

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

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

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

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

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

点击Edit configurations,设置参数

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

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

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

3 、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

java system.in 输入不回显_Java安全之URLDNS链相关推荐

  1. java 图片回显_java实现Simditor图片上传七牛云并回显

    首先呢,我们有这样一个需求: 当图片上传Simditor时,将其保存到七牛云上,然后并回显在我们的Simditor中. 首先,需要我们有一个七牛云帐号,并且配置Simditor富文本编辑器. 其次,我 ...

  2. 【java】批量上传图片并回显功能

    一.前言 在电商的网站中,图片上传功能必不可少,小编在最近的项目中就有遇到了一个批量上传图片并且要回显的功能.可以说这是一个很常见的功能了,已经烂大街了,但是小编还是要认真的分析一下,以便日后用到. ...

  3. java上传图片回显_【java】批量上传图片并回显功能

    一.前言 在电商的网站中,图片上传功能必不可少,小编在最近的项目中就有遇到了一个批量上传图片并且要回显的功能.可以说这是一个很常见的功能了,已经烂大街了,但是小编还是要认真的分析一下,以便日后用到. ...

  4. Java从键盘输入n行字符串_Java十四天零基础入门-Java布尔类型

    不闲聊!!!不扯淡!!!小UP只分享Java相关的资源干货 Java布尔类型 在Java语言中布尔类型的值只包括true和false,没有其他值,不包括1和0,布尔类型的数据在开发中主要使用在逻辑判断 ...

  5. java更新数据库错误就回滚_Java 中对数据库操作时的 回滚

    Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...

  6. java编写在输入特定日期之间_java实现输入日期

    /* 从键盘输入一个日期,格式为 yyyy-M-d 要求计算该日期与 1949 年 10 月 1 日距离多少天 例如: 用户输入了:1949-10-2 程序输出:1 用户输入了:1949-11-1 程 ...

  7. java 文本框输入监听事件_JAVA GUI 事件监听事件 详解 和 案例.

    GUI(图形用户界面) Graphical User Interface(图形用户接口) 用图形的 方式, 来显示 计算机操作的 界面, 这样更方便 更直观. CLI Command Line Use ...

  8. java从键盘输入n个整数_java求解,从键盘输入n个数,要求第一行输入n的值,第二行输入n个数。...

    展开全部 import java.util.Scanner; public class test { static void Sort(int a[],int n) { for (int i = 1; ...

  9. java验证只能输入数字和字母_java:为什么我做的验证只能验证数字和字母不重复,不能验证汉字不重复...

    添加页面jsp部分:-------------//验证表格varvalidator=$("#p").validate({rules:{projectCode:{required:t ...

最新文章

  1. 详解医学顶刊《柳叶刀》最新发表新型冠状病毒研究论文
  2. 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...
  3. DEDE列表缩图中 给缩图添加alt锚文本信息的方法
  4. 音频处理五:(音频的FFT计算)
  5. 传统I/O 数据拷贝
  6. python中re_Python中re(正则表达式)模块学习
  7. SynchronizationContext
  8. Guice之Servlet基础
  9. Latex的subcaption横向插入两张子图的的用法
  10. 掌握后可为孩子收藏的MySQL入门全套
  11. 微课系列(6):Python关键字else的三种用法
  12. 如何查看网页缓存的密码
  13. python之argmax
  14. 国内29家视觉企业及最新动态一览
  15. 5G到底厉害在什么地方?和4G有什么不同?
  16. Java 方法参数传递
  17. 工作日记:JavaScript生成随机色
  18. 基于“业务中台”构建的一些理解
  19. 如何解决Windows 无法完成格式化SD卡问题?
  20. 同一plan节点的targetlist和qual中是对同一var的指针吗?

热门文章

  1. TypeScript 的命名空间 namespace
  2. SAP Spartacus的home page navigation逻辑
  3. 我的工作日志 - 2020年11月11日星期三 阴
  4. 如何自定义SAP Spartacus店铺的购物车图表css风格
  5. 使用SAP CRM Application Enhancement Tool创建表格类型的扩展字段
  6. 如何使用SAP Cloud for Customer的Key User Tool将Mashup添加到UI上
  7. 使用url参数传递SAP Analytics Cloud filter的一个例子
  8. hybris使用impEx导入产品主数据的示例脚本
  9. 阮一峰react demo代码研究的学习笔记 - how is source code converted
  10. how to use object based exception combined with message class in SE91