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

防禦重心轉移:從 IIS 到 SQL Server 資料庫安全的實戰清單

     編輯:關於SqlServer

背景

Code Red、Nimda 等蠕蟲將 IIS 漏洞自動化利用,手工攻擊 IIS 已成過去式。資料庫伺服器往往被忽略,實則為核心資產存放地,且與作業系統深度綁定(特別是 SQL Server),是入侵者奪取系統控制權的關鍵跳板。

一、腳本層防禦:ASP 輸入過濾函數

Function Filter_SQL(strData)
    Dim strFilter, blnFlag, i, arr
    strFilter = "',;,//,--,@,_,exec,declare"  ' 自行擴充
    blnFlag = False
    arr = Split(strFilter, ",")
    For i = 0 To UBound(arr)
        If InStr(strData, arr(i)) > 0 Then blnFlag = True : Exit For
    Next
    If blnFlag Then Response.Redirect "error.asp" Else Filter_SQL = strData
End Function

所有 Request 參數經過濾後再拼接 SQL,或改用參數化查詢徹底解決。

二、SQL Server 核心風險:xp_cmdshell 與擴充預存程序

  • xp_cmdshell:以 SQL Server 服務帳號權限執行作業系統命令。預設僅 sysadmin 可執行,但可授權給其他使用者。早期版本以 SQLExecutiveCmdExec/SQLAgentCmdExec 代理帳號執行;SQL 2000 直接以服務帳號執行。
  • 若攻擊者取得 sa (空密碼) 或具 xp_cmdshell 權限帳號:
EXEC xp_cmdshell 'net user hacker P@ssw0rd /add';
EXEC xp_cmdshell 'net localgroup administrators hacker /add';

即在系統建立管理員帳號,完全控制伺服器。

三、公開可執行的擴充預存程序 (資訊洩露風險)

程序功能
xp_fileexist檢測檔案是否存在
xp_getfiledetails取得檔案詳細屬性
xp_dirtree遞歸列舉目錄結構
xp_getnetname取得伺服器網路名稱

雖不直接破壞,但協助攻擊者偵察環境。

四、登錄表操作擴充程序 (需高權限)

  • xp_regaddmultistring, xp_regdeletekey, xp_regdeletevalue, xp_regenumvalues, xp_regread (Public 可執行), xp_regremovemultistring, xp_regwrite
  • xp_regread 可讀取 HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account 等敏感鍵值,配合破解工具可離線破解系統管理員密碼。

五、資料庫安全配置清單

  1. 套用全數微軟安全更新 (SP4 + 後續修補程式)。
  2. sa 設定高強度密碼,日常管理使用專屬低權限帳號。
  3. 大規模移除擴充預存程序:
    USE master; EXEC sp_dropextendedproc 'xp_cmdshell';
    -- 同理移除 xp_regread, xp_dirtree 等非必要程序
    
  4. 移除 guest 使用者:EXEC sp_revokedbaccess 'guest' (各資料庫)。
  5. 停用非必要網路協定,僅保留 TCP/IP。
  6. 啟用完整登入稽核(成功+失敗),定期檢視記錄:
    findstr /C:"登錄" "D:\Microsoft SQL Server\MSSQL\LOG\*.*"
    
  7. 定期巡檢空/弱密碼帳號:
    USE master; SELECT name, password FROM syslogins WHERE password IS NULL;
    
  8. 巡檢危險權限擴散:
    USE master; SELECT sysobjects.name FROM sysobjects, sysprotects 
    WHERE sysprotects.uid=0 AND xtype IN ('X','P') AND sysobjects.id=sysprotects.id;
    

六、常見問答與技巧

  1. Q: 有 sa 權限但 xp_cmdshell 被刪怎麼辦? A: sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' (SQL 7.0) / xpstar.dll (SQL 2000) 恢復。
  2. Q: 如何透過資料庫導出系統密碼雜湊? A: 上傳 pwdump 系列工具,以 xp_cmdshell 執行導出 SAM 雜湊,再離線破解。
  3. Q: 直接讀取登錄表 SAM 雜湊? A: xp_regread 'HKEY_LOCAL_MACHINE','SECURITY\SAM\Domains\Account','F',SQL 服務帳號為 LocalSystem,權限高於 Administrator。

結語

資料庫伺服器常與 Web 伺服器隔離部署,導致日記檔鮮少被檢視,成為管理盲區。同 DNS、郵件伺服器一樣,資料庫伺服器是入侵者側寫跳板的高價值目標。請將資料庫安全納入核心防禦體系,持續巡檢與強化。

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