MySQL客戶端任意文件讀取漏洞方式
原理
1、通信機(jī)制
由于MySQL服務(wù)端和客戶端通信過程是通過對話形式完成的??蛻舳税l(fā)送一個操作請求,服務(wù)端會根據(jù)客戶端發(fā)送的請求進(jìn)行響應(yīng)。
在這個通信過程中,如果一個操作需要兩步才能完成,當(dāng)客戶端發(fā)完第一個請求后,它會直接丟棄第一個請求,并不會做存儲;然后客戶端會根據(jù)服務(wù)端的響應(yīng),進(jìn)行第二個請求,此時(shí)服務(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)過修補(bǔ)的服務(wù)器,該服務(wù)器會指示客戶端程序傳輸由服務(wù)器選擇的文件,而不是客戶端在 LOAD DATA 語句中指定的文件.
即客戶端讀取的文件內(nèi)容,并不是由客戶端決定的,而是根據(jù)服務(wù)端的響應(yīng)決定的,于是就可以偽造MySQL服務(wù)器,實(shí)現(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運(yùn)行rogue_mysql_server.py
,服務(wù)器開放端口和防火墻即可
說明: 使用python3會報(bào)錯。
4、客戶端連接:在目標(biāo)服務(wù)器使用mysql
指令連接
說明: mysql客戶端需為8.0以下,否則可能無法獲取到想要的數(shù)據(jù)。
5、在服務(wù)端服務(wù)器的rogue_mysql_server.py
路徑下,會生成一個mysql.log
文件,其中就記錄了客戶端服務(wù)器的文件內(nèi)容.
使用場景
1、利用該漏洞,讀取目標(biāo)服務(wù)器上的任意文件
2、利用目標(biāo)網(wǎng)站能連接外部數(shù)據(jù)庫的功能點(diǎn),讀取目標(biāo)服務(wù)器上的任意文件
防范措施
1.使用--ssl-mode=VERIFY_IDENTITY
來建立可信的連接
2.mysql客戶端設(shè)置local_infile
為0
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle10個分區(qū)和Mysql分區(qū)區(qū)別詳解
MySQL分區(qū)常用的是:range、list、hash、key,Oracle10g分區(qū)常用的是:range(范圍分區(qū))、list(列表分區(qū))、hash(哈希分區(qū))、range-hash(范圍—哈希分區(qū))、range-list(列表—復(fù)合分區(qū))。下面通過本文詳細(xì)給大家介紹Oracle10個分區(qū)和Mysql分區(qū)區(qū)別,一起看看2017-02-02MySQL數(shù)據(jù)庫備份過程的注意事項(xiàng)
這篇文章主要介紹了MySQL數(shù)據(jù)庫備份過程的注意事項(xiàng),幫助大家更好的理解和維護(hù)MySQL,感興趣的朋友可以了解下2020-11-11MySQL插入不了中文數(shù)據(jù)問題的原因及解決
最近發(fā)現(xiàn)新安裝的MySQL數(shù)據(jù)庫不能插入中文字段,所以下面這篇文章主要給大家介紹了關(guān)于MySQL插入不了中文數(shù)據(jù)問題的原因及解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05win10下mysql 8.0.18 安裝配置方法圖文教程(windows版)
這篇文章主要介紹了windows版的mysql 8.0.18 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11連接mysql報(bào)錯——沒有設(shè)置“usessl=false”的問題
這篇文章主要介紹了連接mysql報(bào)錯——沒有設(shè)置“usessl=false”的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08