郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
SQL Server 数据库
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。
1 SQL Server 数据库 SQL 注入基础知识
- 数据库后缀名:
.mdf
- 端口号:1433
- 在 SQL Server 中可以一次执行多语句操作的:
- 多条 SQL 语句是用分号隔开:
select * from table1; select * from table2
- 多条 SQL 语句是用分号隔开:
1.1 SQL Server 三个权限级别:
- sa 权限:拥有SQL Server数据库的最高权限。sa 用户是 System users 的简称。
- db 权限:赋予用户对数据库的操作权限。dbo 用户是 Database Owner 的简称,是每个数据库的默认用户,具有所有者权限。
- public 权限:默认 public 用户不能访问任何用户创建的对象。public 不属于数据库固定角色,但所有数据库用户都是其成员,且无法修改。
1.2 SQL Server 数据库的 6 个默认库
-
4 个系统数据库:master 、model 、msdb 、tempdb。其中 model 和 tempdb 默认没有数据表。
- master 数据库:控制 SQL Server 的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息。
- model 数据库:是建立所有用户数据库时的模板。当你建立一个新数据库时,SQL Server 会把 model 数据库中的所有对象建立一份拷贝并移到新数据库中。在模板对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。
- msdb 数据库:是 SQL Server中 的一个特例。如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库。不同之处是所有的任务调度、报警、操作员都存储在 msdb 数据库中。该库的另一个功能是用来存储所有备份历史。SQL Server Agent将会使用这个库。
- tempdb 数据库:是一个非常特殊的数据库,供所有来访问你的 SQL Server 的用户使用。这个库用来保存所有的临时表、存储过程和其他 SQL Server 建立的临时用的东西。例如,排序时要用到 tempdb 数据库。数据被放进 tempdb 数据库,排完序后再把结果返回给用户。每次 SQL Server 重新启动,它都会清空 tempdb 数据库并重建。永远不要在tempdb数据库建立需要永久保存的表。
-
2 个实例数据库:ReportServer、ReportServerTempDB。
-
ReportServer 数据库:能够存储 SSRS 配置部分,报告定义,报告元数据,报告历史,缓存政策,快照,资源,安全设置,加密的数据,调度和提交数据,以及扩展信息。
注意事项:尽管用户能够直接存取在SSRS目录下的数据库并且能够直接修改SSRS使用的对象;但在实践中,不推荐(或不支持)这样做,因为在SSRS目录下的内在数据和结构不能被保证与不同版本的SSRS、服务包或补丁相兼容。
-
ReportServerTempDB 数据库: 是 SSRS 使用的临时数据库。这个数据库负责存储中间处理结果,例如报表服务器生成的会话和执行数据、缓存报表以及工作表。
-
1.3 注释符号
1. -- (--最后有一个空格)
2. /* content */
1.4 SQL Server 注入常用语句及函数
sys.database # SQL server 中的所有数据库
sys.sql_logins # SQL server 中的所有登录名
information_schema.tables # 当前用户数据库中的表
information_schema.columns # 当前用户数据库中的列
sys.all_collumns # 用户定义对象和系统对象的所有列的联合
sys.database_principals # 数据库中每个权限或列异常权限
sys.database_files # 存储在数据库中的数据库文件
sysobjects # 数据库中创建的每个对象(例如约束、日志以及存储过程)
select @@version; # 查询数据库的版本
select @@servername; # 查询服务名
select host_name(); # 主机名,注:使用 Navicat 远程连接时,此结果是本地主机名,而非目标主机的主机名。
select db_name(); # 查询当前数据库名
select db_name(database_id); # 指定要显示数据库名的 ID,"1-6" 是默认数据库,自定义创建的库从 "7" 开始。
select user; # 查询当前数据库的拥有者
use labdb; # 切换到 labdb 数据库
top n # 查询前n条记录:SELECT TOP 1 * FROM users;
limit raw_count, offset_num # 查询第 raw_count 条开始的 offset_num 条数据
select substring('str',2,1); # 截取给定字符串的索引为 2 的 1 个字符
select ascii('str'); # 查询给定字符串的 ascii 值
select len('str'); # 查询给定字符串的长度
sp_spaceused # 显示行数、保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间。
EXEC sp_spaceused @updateusage = 'TRUE'; # 查询当前已更新数据库的大小。
EXEC sp_spaceused 'table_name'; # 查询指定表大小
# 权限判断
# 判断是否是 SA 权限
select is_srvrolemember('sysadmin')
# 判断是否是 db_owner 权限
select is_member('db_owner')
# 判断是否是 public 权限
select is_srvrolemember('public')
1.5 SQL Server 中的 INFORMATION_SCHEMA
SQL Server 中 INFORMATION_SCHEMA
视图可以检索数据库中的对象的元数据。您可以直接在当前实例的数据库调用需求的数据。MSSQL 中的 INFORMATION_SCHEMA
符合 ISO 标准,因此查询操作类似于 Mysql。
1.5.1 Catalog
与 Schema
- 从层级上来说:一个数据库系统包含多个 Catalog,每个 Catalog 又包含多个 Schema,而每个 Schema 又包含多个数据库对象(表、视图、字段等)。
- 该数据库对象的完全限定名称:
Catalog.Schema.Table
- 目的:解决命名冲突的问题
2 注入检测方法
2.1 正常查询方法
通过正常查询观察可注入点;
2.2 基于闭合报错的检测方法
一般来说,数据库都是使用单引号/双引号等进行闭合,如果直接在可注入点输入一个单引号'
/双引号 "
数据库因为多输入字符导致无法闭合而报错;
例:http://www.lab.com/index.asp