简述
Microsoft SQL server也叫SQL server / MSSQL,由微软推出的关系型数据库,默认端口1433
常见搭配C# / .net + IIS+mssql
mssql的数据库文件
数据文件(.mdf):主要的数据文件,包含数据表中的数据和对象信息
日志文件(.ldf):记录数据库的所有操作
MSSQL的系统数据库
master:主要为系统控制数据库,其中包括了所有配置信息、用户登录信息和当前系统运行情况。
model:模版数据库
tempdb:临时容器
msdb:主要为用户使用,所有的告警、任务调度等都在这个数据库中。
MSSQL注入常用的系统视图
1.sys.objects:可以查看所有类型的数据库对象,包括表、视图、存储过程。主要我们用来查询数据库的表,以及表的object_id,常用字段:name,object_id(表的唯一标识符),type(表的类型,U为用户创建的,S是系统基础表),sysobjects中为xtype。
2.sys.columns:存储数据库中的每个表的列信息,包括列名、数据类型、长度等。常用字段:object_id,name,column_id
3.sys.databases:该视图包含了 SQL Server 实例中所有数据库的信息,如数据库名、创建日期,我们主要用来查看有哪些数据库,常用字段:name,database_id,owner_sid(数据库所有者的id,系统数据库为0x01)
4.sysobjects: 旧版的sys.objects; sysdatabases: 旧版的sys.databases; syscolumns:旧版的sys.columns
5.INFORMATION_SCHEMA.TABLES:用法类似于mysql,查询表的名字
6.INFORMATION_SCHEMA.COLUMNS:查询列名的,用法类似mysql
MSSQL权限
一般MSSQL有的两种不同类型的权限,分别针对不同的对象:1.服务器级别的权限,2.数据库级别的权限在服务器和数据库的权限设置当中,又有两个概念:1.用户 2.角色
用户是登录数据库的实体,而角色是用户的权限集合。类似于当官的人和官职,不同官职代表不同的权限也就是数据库的角色,而同一个官职可以有多人,当官的具体的人就是数据库的用户。*也类似于windows的组*
用户和角色在服务器级别以及数据库级别都会存在,服务器的最高权限可以操作数据库服务器以及数据库的所有操作,而数据库的最高权限有可能(因为有时用户会同时具有数据库的最高权限以及服务器的最高权限)仅可以操作当前数据库的所有操作,并不能进行跨库以及操控整个数据库服务器。
服务器级别的最高权限角色是 sysadmin 角色,数据库级别的最高权限角色是 db_owner 角色。
那么一个登录用户的权限主要看用户所在的角色是什么。
服务器级别角色:
1.sysadmin:具有服务器级别的最高权限,可以执行所有操作。
2.serveradmin:很高的权限,几乎可以执行所有操作,包括操作所有数据库
数据库级别角色:
1.db_owner:数据库级别的最高权限,可以执行数据库的所有操作
2.db_datareader:具有只读访问数据库中所有表的权限。
3.db_datawriter:具有写入和修改数据库中所有表的权限。
4. db_securityadmin:负责管理数据库安全相关的操作,包括分配权限、创建和管理角色等。
5.db_backupoperator:负责数据库备份和恢复的操作,可以执行备份和恢复数据库的任务。
MSSQL常用注入语句
判断当前用户权限
SELECT SYSTEM_USER;返回当前服务器用户登陆名
SELECT USER;返回当前数据库用户所在数据库中的身份
--判断是什么角色,如果是返回1,不是返回0
is_srvrolemenber('角色名')
is_menber('角色名')
判断是否为服务器SA角色
判断是否为服务器public角色
判断是否位数据库db_owner角色
获取数据库版本
获取数据库名
select db_name() 查询当前数据库名
select db_name(5) 查询第一个非系统数据库(通过查询sys.databas可以看到四个owner_sid为0x01的系统库排在前面,以此类推)
select file_name(1)一般数据库名文件名和数据库名是相同的,如果db_name被过滤可以试这个
select top 1 name from sys.databases where owner_sid<>0x01 and name not in (name1,name2)
owner_sid<>0x01中<>是不等的意思,因为0x01是系统表
获取数据库表名
-跨库查询
select top 1 name from 数据库名.dbo.sysobjects where xtype='u'
dbo是用户名,默认的,没明确指定都创建在dbo下
select top 1 name from 数据库名.sys.tables
-当前库查询
select top 1 name from sys.objects where xtype='u'
select top 1 name from sys.tables