去年提出的這個問題,在公司大佬們的幫助下,我終于理解了其原理,并利用了 ceye 平臺成功進行了復現。
這里我將對原理進行總結,并展示如何利用 CEYE 平臺進行復現。
原理分析
雖然這個漏洞利用了 mysql 的 LOAD_FILE 函數,但其本質是利用了 Windows 資源管理器,通過 // 協議進行子域名的 DNS 解析,將有用信息作為子域名傳遞出來。
DNS 解析基本原理
首先,讓我們了解一下 DNS 解析的基本過程:
詳細解釋 DNS 域名解析過程如下:
-
當你在電腦上打開瀏覽器并輸入一個域名(如 www.163.com)時,你的電腦會向本地 DNS 服務器(通常由網絡服務提供商如中國電信或中國移動提供)發送一個 DNS 請求。
-
本地 DNS 服務器首先會檢查其緩存記錄,如果找到該域名的記錄,直接返回結果。如果沒有找到,它會向 DNS 根服務器查詢。
-
根 DNS 服務器不直接記錄域名和 IP 地址的對應關系,而是指導本地 DNS 服務器到 .com 域服務器繼續查詢,并提供該域服務器的地址。
-
本地 DNS 服務器接著向 .com 域服務器發送請求,.com 域服務器會告知本地 DNS 服務器該域名的解析服務器地址。
-
最后,本地 DNS 服務器向該域名的解析服務器發送請求,獲取域名和 IP 地址的對應關系,并將結果返回給用戶電腦,同時將該對應關系緩存起來,以便下次查詢時加速訪問。
總結:
當你查詢 abc.hack.com 這樣的子域名時,hack.com 的 DNS 服務器會收到你的解析請求,這就是 out_of_band 利用的原理。
為什么我說這是對 Windows 資源管理器的利用?下面進行演示:
當你在資源管理器地址欄輸入 u0ocor.ceye.io(我的測試賬號的 DNS 解析服務器地址)時,你的測試服務器會收到 DNS 解析請求,并記錄下來(資源管理器這里不好截圖)。
數據庫漏洞復現
當你存在注入點時,如果查詢結果不會回顯,這個 out_of_band 就非常有用了。這里我們直接從數據庫開始,不設計后端查詢代碼。
測試環境:
參數 secure_file_priv 是全局變量,可以通過以下語句查詢:
A 機:
B 機:
解釋:
這個變量用于限制數據導入和導出操作的影響,如 LOAD DATA、select…INTO OUTFILE 語句和 LOAD_FILE() 函數。
-
如果變量設置為目錄名稱,服務器會將導入和導出操作限制在該目錄中。該目錄必須存在,服務器不會自動創建。
-
如果變量為空,不會產生影響,可能會導致不安全的配置。
在 MySQL 5.5.53 之前,此變量默認為空,因此可以使用這些函數。但在 5.5.53 之后的版本中,NULL 值會禁用這些功能。(根據兩臺測試機器不同版本的 MySQL 來判斷,可能會默認為 MySQL 的 /upload 根目錄)
補充兩個機器的 MySQL 版本:
A 機:
B 機:
復現
在滿足上述全局變量條件下,注意以下四點:
- 最大查詢長度問題,文件的大小限制。
- 文件編碼是否與數據庫相同。
- 絕對路徑需要使用 //。
- 子域名最大長度問題,DNS 規定,域名中的標號由英文字母和數字組成,每個標號不超過 63 個字符,不區分大小寫字母。標號中除連字符(-)外不能使用其他標點符號。
下面進行演示:
A 機:
效果如圖:
B 機:
效果如圖:
至于能讀取什么文件或查詢什么數據,取決于具體情況和需求。讀取文件時需要考慮文件權限、編碼等問題。
漏洞限制
-
限制在 Windows 系統,因為原理是利用了 LOAD_FILE 在 Windows 中讀取文件時利用了資源管理器(可能不準確,未具體研究,但能與資源管理器進行相同的 DNS 查詢操作,官方文檔中未提及)。
-
在 MySQL 5.5.53 之前,參數 secure_file_priv 一直為空,可以任意讀取文件。在我的測試中,之后的 MySQL 版本已對此有所限制(目錄限制,無法隨意讀取文件)。
-
漏洞的利用點不一定限于數據庫(更不限于 MySQL),如果你能喚起 Windows 的資源管理器,就可以成功利用這個 DNS 通道查詢傳輸信息。
知識擴展
一些可用 payload:
- Windows:
- SQL Server:
- oracle:
- MySQL:
- postgresql:
- xml Entity Injection
- Struts2
- FFMpeg
- Weblogic
- ImageMagick
- Resin
- Discuz
擴展玩法
從這個漏洞出發,拓展到任意主機上,這是一種利用 DNS 進行內網穿透傳輸信息的技術,可以應用于某些滲透場景。
用 Kali 演示了一個小腳本:
推薦一個工具:dnscat2,
下載地址:
dnscat2 提供客戶端和服務端。
使用的條件:
- 一臺 VPS
- 一個域名控制權限
- 一臺內網權限
具體使用可以結合兩篇博客進行學習,這里不做演示,擴展閱讀:
- 利用 DNS 隧道傳遞數據和命令來繞過防火墻
- 利用 PowerShell 和 Dnscat2 繞過防火墻
技術有限,如文中有理解錯誤的地方,希望大家指出,我將及時進行更正。