WEB安全之:SQL Server 数据库 SQL 注入

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

SQL Server 数据库

SQL Server 是Microsoft 公司推出的关系型数据库管理系统。

1 SQL Server 数据库 SQL 注入基础知识

  • 数据库后缀名:.mdf
  • 端口号:1433
  • 在 SQL Server 中可以一次执行多语句操作的:
    • 多条 SQL 语句是用分号隔开:select * from table1; select * from table2

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 默认没有数据表。

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

  • 从层级上来说:一个数据库系统包含多个 Catalog,每个 Catalog 又包含多个 Schema,而每个 Schema 又包含多个数据库对象(表、视图、字段等)。
  • 该数据库对象的完全限定名称Catalog.Schema.Table
  • 目的:解决命名冲突的问题

2 注入检测方法

2.1 正常查询方法

通过正常查询观察可注入点;

2.2 基于闭合报错的检测方法

一般来说,数据库都是使用单引号/双引号等进行闭合,如果直接在可注入点输入一个单引号' /双引号 " 数据库因为多输入字符导致无法闭合而报错;

例:http://www.lab.com/index.asp
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值