MYSQL8.0中关于load data infile命令
提醒:遇到软件不同版本时,参考文档才是最佳的学习资料。
在学习mysql注入时认识了 LOAD DATA INFILE
语句。在注入时我们会需要一些特殊的文件,如配置文件,密码文件等。当拥有数据库权限时,可以将系统文件利用 load data infile
导入数据库中。
根据官方文档,了解该语句语法:
LOAD XML
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE [db_name.]tbl_name
[CHARACTER SET charset_name]
[ROWS IDENTIFIED BY '<tagname>']
[IGNORE number {LINES | ROWS}]
[(field_name_or_user_var
[, field_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
首先我建了一个这样的表:
然后我意图将这个文档的内容插入表中
首先查看local_infile,将其开启为ON。
mysql >set global local_infile=1;
mysql> show global variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
但是出现报错,通过参考文档发现高版本mysql将本地数据加载操作限制在了指定文档中。
//找到指定文件夹
mysql> show variables like '%secure%';
+--------------------------+------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------+
| require_secure_transport | OFF |
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+--------------------------+------------------------------------------------+
//也有root权限
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
//存在报错;
mysql> load data local infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' into table test2 fields terminated by '\n';
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
发现 local 删掉就不会报错了?
LOCAL:
该关键字影响文件的预期读取位置及错误句柄。需要客户端及服务端都开启该选项,如果mysqld的启动参数包含local-infile=0
,那么指定该参数是无效的。
使用时,客户端程序读取文件并将其内容发送到服务器。服务器在存储临时文件的目录中创建文件的副本,如果此目录中缺少足够的空间来存储副本,则也可能导致 LOAD DATA LOCAL
语句失败。
mysql> load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' into table test2 fields terminated by '\n';
Query OK, 4 rows affected (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
//这样也可以
mysql> load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' ignore into table test2 character set gbk fields terminated by '\t' lines terminated by '\n';
//将 2.txt 导入到 test2 表中,character set gbk 是字符集设置为 gbk,fields terminated by 是每一项数据之间的分隔符,lines terminated by 是行的结尾符。
Query OK, 4 rows affected (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
随后我添加了环境变量,从cmd中进入mysql,成功使用 load data local infile
语句。
还要注意:
表中字段的类型要与输入数据类型对应,即为varchar即字符串类型,才能写进去;
查看 secure_file_priv
属性设置是否正确;
高版本的mysql如果是空值应该要写NULL或者0,否则会报错 Incorrect integer value: ” for column ‘id’ at row 1
,但是这里只设置了一列因而不会有这个错;
在windows下, 路径可以为斜杠 ‘/’ 或双反斜杠 ‘\\’ 。
官方文档中也提到了安全要求:
对于非加载操作,服务器读取位于服务器主机上的文本文件,因此必须满足以下安全要求:
必须具有 FILE 权限,该操作受 secure_file_priv
系统变量设置的约束:
- 如果变量值是非空目录名,则文件必须位于该目录中。
- 如果变量值为空(不安全),则服务器只需读取该文件。
对于装入操作,客户端程序读取位于客户端主机上的文本文件。由于文件内容是通过客户端与服务器的连接发送的,因此使用速度比服务器直接访问文件时慢一些。另一方面,您不需要 FILE 特权,并且该文件可以位于客户端程序可以访问的任何目录中。