渗透测试往往由信息收集开始,而提权是渗透测试中较为重要的环节,若始终以“低权限”身份进行渗透,测试出的问题相对于高权限的质量会低很多,权限提升意味着用户获得不允许他使用的权限。比如从一个普通用户,通过“手段”让自己变为管理员用户,也可以理解为利用操作系统或软件应用程序中的错误,设计缺陷或配置错误来获得对更高访问权限的行为。
提权又分为系统提权、数据库提权、第三方提权等等,此篇文章就介绍了SQL Serve部分的提权方法,一起来看看吧。
知识补充
系统库
库名 | 含义 |
master | master数据库控制SQLserver数据库所有方面。这个数据库中包括了所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息等。 |
model | model数据库是建立所有用户数据库时的模版。新建数据库时,SQLserver会把model数据库中的所有对象建立一份拷贝并移到新数据库中。在模版对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。 |
tempdb | tempdb数据库是一个非常特殊的数据库,供所有访问SQLserver数据库的用户使用。这个库用来保存所有的临时表、存储过程和其他SQLserver建立的临时用的东西。 |
msdb | msdb数据库是SQLserver数据库中的特例,若想查看此数据库的实际定义,会发现它其实是一个用户数据库。所有的任务调度、报警、操作员都存储在msdb数据库中。该库的另一个功能是用来存储所有备份历史。SQLserver agent将会使用这个库。 |
存储过程
一、介绍
存储过程是一个可编程的函数,它在数据库中创建并保存,是存储在服务器中的一组预编译过的T-SQL(SQL语言版本之一,只能在SQLserver使用)语句。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式(可以将存储过程理解为函数调用的过程),使用execute命令执行存储过程。
二、分类
系统存储过程、扩展存储过程、用户自定义的存储过程。
- 系统存储过程主要存储在master数据库中,以"sp_"为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
- 扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以“xp_"为前缀,使用方法与系统存储过程类似;
- 用户定义的存储过程是SQLServer的使用者编写的存储过程;
三、执行
存储过程为数据库提供了强大的功能,但在相应的权限下,攻击者可以利用不同的存储过程还行不同的高级功能,如:创建数据库用户、枚举文件目录、执行任意系统命令等。正因如此,SQLserver2005、2008等之后的版本分别对存储过程做了权限控制,以防滥用。
以下提权方式多为利用存储过程进行提权,想要查看数据库中是否有对应的存储过程,可以用下面的语句,若返回结果为1,则说明已开启。
select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate';
或者可以查询对应数据库中定义的存储过程有哪些
select routine_catalog,specific_schema,routine_name,routine_definition
from master.information_schema.routines
order by routine_name;
环境:
- Windows server2003
- SQLserver2005;
xp_cmdshell扩展存储过程提权
扩展存储过程中xp_cmdshell是一个开放接口,可以让SQLserver调用cmd命令,直接用SQL语句实现cmd操作,危害非常大。此存储过程在SQLserver2000中默认开启,2005本身及之后的版本默认禁止,所以想要使用该存储过程,就需要拥有SA账号相应权限,使用sp_configure(显示或更改当前服务器的全局配置设置)将其开启。
SA是Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值。2005的xp_cmdshell的权限一般是system,而2008多数为nt authority\network service。
一、前提条件
- 已获取到sqlserver sysadmin权限用户的账号与密码;
- SQLserver服务未降权:
- SQLserver可以外连;
执行系统命令添加管理员账号提权
- 连接SQL server数据库,检查xp_cmdshell是否开启
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell;
\# xtype为对象类型,xtype='x'表示xp_cmdshell的对象类型为扩展存储过程。
若返回结果为1,则证明开启。
- 如果xp_cmdshell被删