
提醒:遇到软件不同版本时,参考文档才是最佳的学习资料。
在学习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 '']
[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:ProgramDataMySQLMySQL Server 8.0Uploads | +--------------------------+------------------------------------------------+ //也有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 特权,并且该文件可以位于客户端程序可以访问的任何目录中。