MysqlLOADDATA读取客户端任意文件

MySQL客户端通过对话与MySQL服务器进行通信,客户端发送运行请求,服务器根据请求进行响应。
如果操作需要分两步完成,客户端发送第一个请求后不会存储它,而是会忽略它。
根据服务器的响应继续第二步。
服务器可以欺骗客户端执行某些操作。
正常连接时,客户端发送一条MySQL语句,服务器端返回查询后的结果。
但MySQL的LOADDATAINFILE语法可以读取文件内容并将其插入到表中。
此命令可以读取服务器或客户端文件,具体取决于LOCALmodifier是否存在。
读取服务器文件内容的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_length、sequence_id、payload等。
当客户端支持SSL时,它会发送Protocol::SSLRequest数据包来使服务器建立SSL层。
否则发送Protocol::HandshakeResponse。
根据分析,客户端发送的是Protocol::HandshakeResponse41。
分析customertag、max_packet_size、字符集等字段。
客户端支持LOADDATALOCAL,这对于读取客户端上的本地文件至关重要。
Ok_Packet和COM_QUERY包分析。
当选择安全数据库时,会捕获更多的数据包。
当执行命令将文件/etc/passwd的内容写入users表时,捕获的数据包中包含COM_QUERY。
分析数据包结构,找到创建恶意MySQL服务器的关键点。
根据数据包的结构写入payload,包括伪造的数据包头和payload部分。
创建概念验证(POC),实现通信流程,修改第二个数据包的响应内容。
从网上复制的POC中,连接建立过程中发送的数据不包含包头,但发送payload时包含包头。
在服务器上运行脚本,连接到客户端,并接收/etc/passwd文件的内容。
要读取/flag,请创建包头和有效负载部分,包括包类型和文件名。
标头包括长度字段和序列号,有效负载部分包括包类型和文件名(转换为十六进制)。

MySQL数据库如何快速插入数据mysql数据库插入数据

MySQL数据库是一种用于存储大量数据的数据库系统,非常适合网站开发。
有时我们需要快速向MySQL数据库中插入大量数据,下面将介绍如何快速插入数据。
1、使用LOADDATAINFILE命令LOADDATAINFILE命令是MySQL提供的一个快速输入数据的功能,可以将数据从本地或远程输入到MySQL数据库中。
语法如下:LOADDATA[LOW_PRIORITY|CONCURRENT][LOCAL]INFILE'file_name'[REPLACE|IGNORE]INTOTABLEtbl_name[PARTITION(partition_name,…)][CHARACTERSETcharset_name][{FIELDS|COLUMNS}[TERMINATEDBY'string'][[选项]包含在“char”中][ESCAPEDBY“char”]][行[STARTINGBY]'string'][TERMINATEDBY'string']][IGNOREnumber{LINES|ROWS}][(col_name_or_user_var,…)][SETcol_name=expr,…]例如:LOADDATALOCALINFILE'/tmp/user.txt'INTOTABLEuserCHARACTERSETf8FIELDSTERMINATEDBY'\t'LINESTERMINATEDBY'\n'IGNORE1LINES(姓名,年龄);2.使用INSERTINTOSELECT命令MySQL还提供了另一个快速插入数据的功能(INSERTINTOSELECT),它可以快速从现有表中复制一些数据,并将其插入到另一个表中。
语法如下:INSERTINTOtable_name[(column_list)]SELECT*FROMother_table[WHEREcondition];例如:INSERTINTOusers(name,age)SELECTname,ageFROMtemp_userWHEREage>18;上面提到的两种方法要想快速插入,这种情况下,可以使用批量插入方法(BulkInsert)。
通过形成SQL语句,可以将多条记录插入到整个MySQL数据库表中。
例如:INSERTINTOuserVALUES(1,'汤姆',24),(2,'约翰',20),(5,'凯特',26);它可以将多个SQL语句放在一起,然后通过单个数据库调用一次性执行所有这些语句。
它可以简化、快速地操作MySQL数据库,从而达到快速录入数据的目的。
例如:BEGININSERTINUser(name,age)VALUES('Tom',24);INSERTINUser(name,age)VALUES('John',20);INSERTINUser(name,age)VALUES('Cate',26);END;以上就是一些如何快速插入MySQL数据库的常用方法,通过使用合适的方法,可以提高插入数据的速度,提高网站的效率。