MySQL隱碼攻擊直接獲取Shell的前提條件

noname發表於2019-03-28

1.寫入webshell

使用select 'payload' into outfile '/path/to/webshell'即可寫入一個webshell到/path/to/webshell,這種方式的利用條件為:

  • mysql賬戶有 File_priv 許可權,即 select user,file_priv from mysql.user where user=current_user()為 Y
  • show variables like '%secure_file_priv%' 的結果符合要求(前面的語句執行結果可能與 select @@global.secure_file_priv不同,但經過我的測試這時候前面的語句的結果是準確的,不過我也不知道為什麼兩個結果會不一致,按照MySQL官方文件的說法該變數是全域性系統變數,應該是不會出現兩個不同結果的。。。如果有許可權的話還是用 select * from information_schema.session_variables where variable_name='secure_file_priv' 看比較好,這個肯定準確)。具體要求如下:
    • 如果該變數為空,則變數無效,這時候最容易利用
    • 如果變數為目錄的絕對路徑,則伺服器會將匯入和匯出操作限制為僅適用於該目錄中的檔案
    • 如果設定為NULL,則伺服器禁用匯入和匯出操作。
  • 知道網站根目錄的絕對路徑,且MySQL服務所屬使用者(預設為mysql)對根目錄有可寫許可權

2. UDF寫入shell

原理同webshell,都是通過select 'payload' into outfile '/path/to/plugin_dir'寫入payload,所以利用條件和webshell的前兩點相同,只有第三點不一樣,那就是mysql服務所屬使用者需要有外掛目錄(show variables like '%plugin%'檢視目錄絕對路徑)的寫入許可權,linux上mysql的plugin目錄預設為root所有,許可權為755。需要注意的是通過UDF的方式獲取到的shell是管理員許可權,所以有些時候可以用來提權。

相關文章