MysqlLOADDATA读取客户端任意文件

MySQL客户端和服务器通过对话进行交互。
客户端发送操作请求,服务器根据请求进行响应。
如果一个操作需要分两步执行,客户端发送第一个请求后不会保存,而是将其丢弃。
第二步根据服务器响应继续。
服务器可以欺骗客户端执行某些操作。
通常,在交换数据时,客户端发送MySQL语句,服务器在请求后返回结果。
但是MySQL的LOADDATAINFILE语法可以读取文件的内容并将其插入到表中。
该命令可以读取服务器或客户端文件,具体取决于是否指定了LOCAL修饰符。
读取服务器文件内容的SQL语句:读取客户端文件内容的SQL语句:与读取服务器文件内容相比,读取客户端文件内容包含更多本地关键字。
这个过程可以表示为两个人之间的对话。
正常情况下进程运行正常,但客户端第二次发送文件的时机完全取决于服务器。
如果服务器出现故障,可能会出现如下对话框:服务器非法获取/etc/passwd文件的内容。
接下来进行实验,创建一个恶意服务器来欺骗客户端。
编写欺骗恶意MySQL服务器的POC需要了解MySQL协议,因此解析MySQL协议包。
伪造的MySQL服务器已被实施来非法读取客户端文件。
分析MySQL协议包需要了解Wireshark和MySQL官方文档。
使用Wireshark捕获客户端(192.168.239.129)和服务器(192.168.1.3)之间的MySQL通信包。
在客户端上打开MySQL并注意允许外部连接的设置。
打开Wireshark,选择捕获Vmware关联的网卡,过滤MySQL协议并连接虚拟机。
笔记。
不要使用mysql8.0.12版本,否则数据批量显示不完整,用户名不显示。
这可能是由于更强的加密。
MySQL协议支持通过TLS进行加密和身份验证。
分析捕获的数据包并确定它们正在使用TLS加密。
执行connect命令时收到的数据包:分析数据包的结构,并与官方文档进行对比。
当客户端连接到服务器时,服务器发送初始确认数据包。
根据版本和配置设置,服务器发送不同的初始数据包。
从MySQL版本3.21.0开始,发送Protocol::HandshakeV10。
以MySQL版本5.7.26为例,发送Protocol::HandShakeV10。
请参阅包结构的文档。
在Wireshark中分析服务器发送的原始数据包,包括与文档匹配的协议版本、MySQL服务器版本以及进程ID。
Protocol::HandShakeV10定义了数据包的有效负载部分,标头在MySQLPackets中定义。
解析数据包头,包括payload长度、序列ID、payload等。
当客户端支持SSL时,会发送一个Protocol::SSLRequest数据包,让服务器设置SSL层。
否则,发送Protocol::HandshakeResponse。
根据分析结果,客户端发送Protocol::HandshakeResponse41。
分析clientflag、max_packet_size、character_set等字段。
客户端支持LOADDATALOCAL,这是读取客户端本地文件所必需的。
分析Ok_Packet和COM_QUERY包。
如果选择安全数据库,则会捕获更多数据包。
当执行命令将/etc/passwd文件的内容写入用户表时,捕获到的数据包中包含COM_QUERY。
分析数据包的结构,找出构建恶意MySQL服务器的关键点。
根据数据包结构写入payload,包括伪造的数据包头和payload部分。
创建POC,实现连接流程,更改第二个数据包响应内容。
从网上复制的POC中,连接建立过程中发送的数据不包含包头,但发送payload时包含包头。
在服务器上运行脚本,连接到客户端并获取/etc/passwd文件的内容。
到读取/flag,生成包头和payload部分,包括包类型和文件名。
标头包括长度字段和序列号,有效负载部分包括数据包类型和文件名(转换为十六进制)。

技术分享|MySQLLoadData的多种用法

在操作和维护数据库时,将文本数据导入数据库是一个常见的需求。
本文介绍了使用MySQLLoadData的各种实用方法,并通过实际场景示例演示了其应用。
首先,一些基本背景信息。
LoadData是MySQL中的一个命令,用于将外部文件数据导入到数据库表中。
本文使用的示例数据为CSV格式,用逗号分隔,字段用双引号分隔。
接下来我们通过几个场景来演示一下LoadData的应用:场景一:如果文本文件包含的字段比数据表多,则只需将文件中的部分数据导入到指定的表中即可。
场景2:如果文本文件包含的字段少于数据表,则表字段包含文件数据和附加字段。
场景3:生成自定义字段数据。
如果表中包含附加字段,可以使用MySQL函数定义自定义数据或者导入时固定值,实现简单的数据转换功能。
场景4:处理定长数据。
通过该函数,获取字符串中特定长度的部分,生成指定列数据,并演示定长数据导入处理方法。
小结部分:1、默认情况下,数据按照文本文件的列、行顺序导入到数据库表中。
2、如果表结构与文本数据不匹配,建议建立列和字段的对应关系,避免数据导入错误。
3.导入大文件时,可以将其分割成多个小文件,并使用分割功能,方便处理。
4.导入完成后,运行指令查看数据并查看是否有任何错误或警告消息。
5、如果数据差异较大或需要清洗转换,应考虑使用专业的ETL工具或先导入MySQL再处理数据。

MySQL官方出品,比mydumper更快的多线程逻辑备份工具-MySQLShellDump&Load

MySQLShellDump&Load是MySQL官方推出的多线程逻辑备份工具。
它旨在提高备份和恢复的速度,从而减少发生灾难时的RTO(恢复时间目标)。
相比mysqldump、mydumper等传统逻辑备份工具,MySQLShellLoad使用LOADDATALOCALINFILE命令导入。
与INSERT操作相比,速度最多可提高20倍,从而显着提高导入速度。
MySQLShellDump&Load工具是在MySQLShell版本8.0.21中引入的,提供了dumpInstance、dumpSchemas、dumpTables和loadDump等功能。
您可以使用util.dumpInstance来备份整个实例的数据,而util.dumpSchemas和util.dumpTables分别用于备份指定库和表的数据。
与util.dumpInstance类似,util.loadDump用于导入backup命令生成的备份集。
MySQLShellDump&Load工具的实现与传统的mysqldump工具类似。
主要区别在于备份和恢复过程中使用了LOADDATAINFILE操作和并行处理功能。
通过配置不同的设置,用户可以进一步优化备份和恢复效率。
值得注意的是,util.dumpInstance和util.loadDump支持并行保存和导入,可以显着提高处理速度。
同时,用户在使用实现块级并行备份时要注意主键或唯一索引的配置。
此外,导入实例时,请确保目标实例的local_in文件设置为ON以允许数据导入。
综上所述,MySQLShellDump&Load工具提供了高效、灵活的备份和恢复解决方案。
通过利用MySQLShell强大的功能和优化的导入机制,它为数据库管理员提供了更快、更可靠的备份和恢复选项。

MySQL中使用LOAD命令快速导入数据mysql中load

在MySQL中使用LOAD命令可以快速导入数据。
在数据库管理中,导入数据是一项重要的工作。
有时手动导入数据会出现很大问题。
MySQL提供LOAD命令来快速导入数据,并生成SQL语句进行快速导入。
LOAD命令的基本语法LOADDATA[LOW_PRIORITY|CONCURRENT][LOCAL]INFILE'filename'[REPLACE|IGNORE]INTOTABLEtbl_name[CHARACTERSETcharset_name][{FIELDS|COLUMNS}[TERMINATEDBY'string'][[OPTIONALLY]ENCLOSEDBY'char'][饵PEDBY'char']][LINES[STARTINGBY'string'][TERMINATEDBY'string']][IGNOREnumberLINES][(col_name_or_user_var,…)][SETcol_name=expr,…]其中LOADDATA为命令名,LOW_PRIORITY代表LOAD、CONCURRENT优先级限制是指添加数据时并发操作而不是一次性操作。
LOCAL表示从客户端文件系统读取文件。
REPLACE和IGNORE指定具体的导入方法。
REPLACE表示如果存在相同记录则覆盖,否则插入IGNORE表示如果出现同名记录则忽略。
INTOTABLE指定导入的目标表的名称。
在FIELDS和COLUMNS之后分别是每个字段的分隔符和边框字符。
在LINES之后,设置行分隔符和首行字符。
如果要跳过某些行,可以使用IGNOREnumberLINES忽略一定数量的行。
设置表和字段分隔符后,您可以指定应插入哪些列(col_name_or_user_var,...),并且可以使用语法SETcol_name=expr插入计算字段。
用例假设我们有一个学生表,其中包含三个字段:id、name和age。
我们有一个名为students.txt的文件,其中包含要插入到students表中的数据(制表符分隔符):1Mary202John213Joe19我们可以使用以下命令将students.txt的数据导入到students表中:LOADDATALOCALINFILE'studentnts。
txt'INTOTABLEstudentFIELDSTERMINATEDBY'\t'LINESTERMINATEDBY'\n'(id,姓名,年龄当然,如果students.txt的分隔符是逗号分隔符,那么FIELDSTERMINATEDBY',');如果行分隔符是\r\n而不是\n,则必须使用LINESTERMINATEDBY'\r\n'。
使用LOAD命令时,数据必须放置在MySQL服务器计算机的本地磁盘上。
如果需要导入非常大的数据集,LOAD命令会变得非常慢,因为它会逐行插入。
但是,使用LOADLOCAL命令可以直接跳过服务器磁盘上的所有数据,直接读取客户端磁盘上的数据。
本地磁盘数据,可以大大提高导入速度。
总结LOAD命令是MySQL中非常有用的工具,可以快速将数据导入数据库。
它允许用户指定特定的导入方式、目标表和字段,并支持跳行。
当我们处理大量数据时,使用LOADLOCAL可以显着减少导入时间。