MySQL客戶端任意文件讀取漏洞方式
原理
1、通信機制
由于MySQL服務(wù)端和客戶端通信過程是通過對話形式完成的??蛻舳税l(fā)送一個操作請求,服務(wù)端會根據(jù)客戶端發(fā)送的請求進行響應(yīng)。
在這個通信過程中,如果一個操作需要兩步才能完成,當客戶端發(fā)完第一個請求后,它會直接丟棄第一個請求,并不會做存儲;然后客戶端會根據(jù)服務(wù)端的響應(yīng),進行第二個請求,此時服務(wù)端就可以欺騙客戶端。
2、語法說明
MySQL服務(wù)端反向讀取客戶端的任意文件是利用了LOAD DATA INFILE語法,該語法主要用于讀取文件內(nèi)容并插入到表中。
-- 讀取服務(wù)端本地文件,并插入到表中 load data infile "/data/data.csv" into table test_table; -- 讀取客戶端本地文件,并插入到表中 load data local infile "/data/data.csv" into table test_table;
針對該語法,MySQL官方文檔原文:
In theory, a patched server could be built that would tell the client program to transfer a file of the server’s choosing rather than the file named by the client in the LOAD DATA statement.” 從理論上講,可以構(gòu)建一個經(jīng)過修補的服務(wù)器,該服務(wù)器會指示客戶端程序傳輸由服務(wù)器選擇的文件,而不是客戶端在 LOAD DATA 語句中指定的文件.
即客戶端讀取的文件內(nèi)容,并不是由客戶端決定的,而是根據(jù)服務(wù)端的響應(yīng)決定的,于是就可以偽造MySQL服務(wù)器,實現(xiàn)通信示例3的效果。
舉例說明:
- 一般流程:
- 客戶端:請把表test的數(shù)據(jù)給我看看
- 服務(wù)端:請查收表test的數(shù)據(jù)
- 通信結(jié)束...
LOAD DATA INFILE正常流程
- 客戶端:我將把我本地的data.csv文件發(fā)給你插入到表test
- 服務(wù)端:好的,請讀取你本地的data.csv文件內(nèi)容并發(fā)給我
- 客戶端: 這是文件里的數(shù)據(jù):1234567
- 通信結(jié)束...
LOAD DATA INFILE欺騙流程
- 客戶端:我將把我本地的data.csv文件發(fā)給你插入到表test
- 服務(wù)端:好的,請讀取你本地的/etc/passwd文件內(nèi)容并發(fā)給我
- 客戶端: 這是文件里的數(shù)據(jù):xxxxxx(/etc/passwd文件中內(nèi)容)
- 通信結(jié)束...
漏洞復(fù)現(xiàn)
1、在服務(wù)端服務(wù)器獲取https://github.com/allyshka/Rogue-MySql-Server的腳本
2、修改rogue_mysql_server.py設(shè)置要讀取的文件名
rogue_mysql_server.py中的filelist 為要讀取的文件地址,例如可改為:
filelist = (
'/etc/passwd',
)3、在服務(wù)端服務(wù)器python2運行rogue_mysql_server.py,服務(wù)器開放端口和防火墻即可
說明: 使用python3會報錯。
4、客戶端連接:在目標服務(wù)器使用mysql指令連接
說明: mysql客戶端需為8.0以下,否則可能無法獲取到想要的數(shù)據(jù)。

5、在服務(wù)端服務(wù)器的rogue_mysql_server.py路徑下,會生成一個mysql.log文件,其中就記錄了客戶端服務(wù)器的文件內(nèi)容.

使用場景
1、利用該漏洞,讀取目標服務(wù)器上的任意文件
2、利用目標網(wǎng)站能連接外部數(shù)據(jù)庫的功能點,讀取目標服務(wù)器上的任意文件
防范措施
1.使用--ssl-mode=VERIFY_IDENTITY來建立可信的連接
2.mysql客戶端設(shè)置local_infile為0
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL獲取二維數(shù)組字符串的最后一個值的實現(xiàn)代碼
這篇文章主要介紹了MySQL獲取二維數(shù)組字符串的最后一個值的實現(xiàn),文中有詳細的代碼示例供大家參考,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-04-04
達夢數(shù)據(jù)庫兼容mysql?GROUP?BY查詢的設(shè)置方式
作為一名數(shù)據(jù)庫管理員或開發(fā)者,當項目需要從MySQL遷移到達夢數(shù)據(jù)庫時,最關(guān)心的莫過于兼容性問題,這篇文章主要介紹了達夢數(shù)據(jù)庫兼容mysql?GROUP?BY查詢的設(shè)置方式,需要的朋友可以參考下2025-11-11

