当前位置: 首页 > news >正文

MSSQL注入前置知识

简述


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

 

http://www.lryc.cn/news/408389.html

相关文章:

  • idea一键为实体类赋值
  • 秋招突击——7/24——知识补充——JVM类加载机制
  • 如何在 Microsoft SQL Server 中增加字段-完整指南
  • 快手电商Android一面凉经(2024)
  • 随机点名器
  • 添加动态云层
  • Spring Boot组成的分布式系统中实现日志跟踪
  • GPT-4o Mini 模型的性能与成本优势全解析
  • web前端 - HTML 基础知识大揭秘
  • HTML meta
  • 【学习笔记】子集DP
  • 苦学Opencv的第十四天:人脸检测和人脸识别
  • PyTorch学习(1)
  • 三思而后行:计算机行业的决策智慧
  • Linux--Socket编程UDP
  • 《javaEE篇》--单例模式详解
  • Java核心 - Lambda表达式详解与应用示例
  • 算法通关:006_1二分查找
  • 总结一些vue3小知识3
  • JAVAWeb实战(前端篇)
  • axios请求大全
  • C# 简单的单元测试
  • Linux中Mysql5.7主从架构(一主多从)配置教程
  • BACnet物联网关BL103:Modbus协议转BACnet/MSTP
  • Go 语言条件变量 Cond
  • PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始
  • Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示
  • Go语言的数据结构
  • python_在sqlite中创建表并写入表头
  • 1.c#(winform)编程环境安装