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