Mysql溯源-任意檔案讀取?

胖三斤1發表於2021-12-30

Mysql溯源-任意檔案讀取?

前言

讀了《MySQL蜜罐獲取攻擊者微信ID》的文章,文中說明了通過mysql蜜罐讀取攻擊者微信ID的過程,抱著學習的態度嘗試了一下

原理

mysql中有一個load data local infile函式能夠讀取本地檔案到mysql資料庫中。當攻擊者用爆破mysql密碼的掃描器掃描到我們的mysql並連線上的時候,客戶端(攻擊者)會自動發起一個查詢,我們(服務端)會給與一個回應,我們在回應的資料包中加入load data local infile讀取攻擊者的本地檔案到我們資料庫中,達到反制的目的。

image

具體過程

LOAD DATA INFILE

LOAD DATA INFILE語句用於高速地從一個文字檔案中讀取行,並寫入一個表中。檔名稱必須為一個文字字串。
LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相對語句。把表的資料備份到檔案使用SELECT ... INTO OUTFILE,從備份檔案恢復表資料,使用 LOAD DATA INFILE。基本語法如下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char' ]
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]

這個功能預設是關閉的,當我們本地mysql伺服器沒有開啟這個功能執行時會報錯:

image

我們可以通過如下命令檢視功能狀態

show global variables like 'local_infile';

image

我們通過如下命令開啟這個功能:

set global local_infile=1;

然後我們通過如下命令嘗試讀取本地的C盤目錄下的1.txt檔案

image

load data local infile 'C:/1.txt' into table test fields terminated by '\n';

image

通訊過程

我們模擬一下攻擊者通過掃描器連線MySQL資料庫的通訊過程
工具:Wireshark

首先我們通過Wireshark抓取通訊流量檢視一下通訊過程

注意:
當自己電腦既是客戶端又是伺服器時,互相訪問時流量並沒有經過網路卡,windows系統又沒有提供本地迴環網路的介面,
wireshark在windows系統上預設使用的是WinPcap來抓包的,用它監控網路的話只能看到經過網路卡的流量,看不到訪問
localhost的流量,所以才會出現第一次連線始終沒有資料包的狀況。解決這個問題的兩種辦法是:要麼伺服器和客戶端
不要在同一臺機器上,要麼用Npcap來替換掉WinPcap,Npcap提供環回介面

1. 首先是Greeting包,返回了服務端的版本資訊

image

2. 接著是客戶端發起連線請求

image

3. 然後經過TCP的三次握手之後,客戶端會自動發起一次查詢,服務端會給予一個回應

image

我們就是在上面的最後一步回應中插入讀取客戶端本地檔案的語句,從而讀取客戶端的本地檔案到資料庫表中。

漏洞復現

下載地址:https://github.com/allyshka/Rogue-MySql-Server

1. 解壓壓縮包

然後編輯rogue_mysql_server.py這個檔案,修改裡面的讀取檔案的路徑(windows或者linux的路徑都行)

image

2. 用python啟動rogue_mysql_server.py

3. 檢視資料庫埠是否開啟nmap -sS -p- 192.168.33.222

image

4. 我們用自己的資料庫連線軟體(例如Navicat)去連線我們剛剛建立的惡意mysql伺服器

  • IP:192.168.33.222
  • PORT:3306
  • USERNAME:root
  • PASSWORD:(空的就行)

image

5. 然後我們會看到當前目錄下面多了一個mysql.log檔案,我們發現本地的C:/1.txt檔案被讀取到了mysql.log檔案中

image

6. 我們通過Wireshark看看這個實驗過程通訊的資料包

  • 首先Greeting包,伺服器返回版本資訊
  • 然後就是客戶端請求連線的登入包
  • 接著就是伺服器回應的一個資料包(ok)

image

  • 接下來我們重點分析後面分析後面三個資料包

這個資料包是像形如Navicat這種資料庫連線軟體在連線之前都會自動傳送的一個請求查詢的。從查閱資料來看,大多數MySQL客戶端以及程式庫都會在握手之後至少傳送一次請求,以探測目標平臺的指紋資訊

SET NAMES utf8mb4

image

接下來就是伺服器端給出的回應包,但是這個資料包裡面大有文章,包含了讀取本地C:/1.txt檔案的命令

image

然後我們就發現接下來客戶端就把伺服器請求的1.txt檔案傳輸到了伺服器。

image

實驗結束

參考文章

  1. https://blog.csdn.net/weixin_46164380/article/details/105230747
  2. https://blog.csdn.net/Java0258/article/details/112332367

相關文章