知识简介

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库

端口号为 1433。数据库后缀名 .mdf。注释符是 。延时命令:WAITFOR DELAY ‘0:0:2’

2008版本之前是system权限,以后就不是了

语句分析

select * from master.dbo.sysobjects where xtype = ‘u’;

对象名的有效格式是:server.database.owner.object,**当引用某个特定对象时,可以省略中间级节点
image.png
image.png

sysobjects 是系统的视图每个数据库都有,该表**存放该数据库内创建的所有对象每个对象在表中占一行**

此系统表中对我们有用的只有3个字段,NAME、**XTYPE、**ID

name:表名信息 | xtype:表的类型—->S代表系统自带表,U代用****户创建的表

id字段的值用来连接syscolumns表,syscolumns存储了所有列名,名称用name字段表示
image.png
**

top n关键字

由于MSSQL中不存在Limit,那么想要输出一条数据怎么办呢,直接top 1,输出两条数据top 2

输出第二条数据:top 1+限制条件

获取值都要用top n关键字,后面跟列名

3个权限级别

sa权限 数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
db权限 文件管理,数据库操作等权限 users-administrators
public权限 数据库操作 guest-users

判断当前用户权限

  1. 判断是否是SA权限
  2. select is_srvrolemember('sysadmin')
  3. 判断是否是db_owner权限
  4. select is_srvrolemember('db_owner')
  5. 判断是否是public权限
  6. select is_srvrolemember('public')

6个默认数据库

4个系统数据库:**master、model、msdbtempdbmodel 和 tempdb 默认是没有数据表的**)
image.png

2个实例数据库:ReportServer、ReportServerTempDB
image.png

但是如果用navicat远程连接的话,只会显示2个实例数据库:**ReportServerReportServerTempDB
image.png**

Union注入

靶机:172.16.90.125
image.png

访问http://172.16.90.125:81/Index.aspx?id=1
image.png

判断数据库、注入类型、权限

and 1=1 正常
and 1=2 报错
所以是数字型注入
image.png
image.png

因为网站使用的是aspx脚本,初步判断网站使用的是Mssql或者Oracle数据库,需进一步判断
image.png

http://172.16.90.125:81/Index.aspx?id=1 and exists (select from sysobjects)返回正确页面
说明此数据库存在sysobjects表*sysobjects是mssql数据库系统表
,判断此数据库为mssql数据库
image.png

再来判断下权限,ok,最高权限
image.png

判断字段数

order by** 判断当前表的字段数**
image.png
image.png

判断显示位

union select联合查询语句获取字符型输入位
这里要采用null的方式来占位,因为mssql数据库是个强类型的数据库,对数据格式比较严格
image.png
**

获取库名

方法1

db_name(n),表示获取第n个数据库名称
经测试有7个数据库
**image.png
image.png
image.png

方法2

第一个用户数据库的名称
dbid>4原因:前4个都是系统自带库
image.png

获取第二个用户数据库名称

<>表示不等于,在dbid>4前提下,不等于第一个用户数据库,那就是第二个数据库了
image.png

也可以直接dbid>5**,获取第二个用户数据库名称
image.png

获取表名

select top n 列名 sysobjects where xtype=’u’ | 爆表名用sysobjects
image.png
image.png

获取列名

必须要知道表的id值 | 1:通过select语句 2:通过函数

方法1

通过id连接表,在获取表中字段

1.1 先获取id,在获取字段
image.png
image.png
image.png
image.png

1.2 直接子查询获取字段
image.png

image.png

image.png

方法2

col_name()+object_id()**函数**遍历admin表中的所有字段名

col_name(‘表名’,n) 获取指定表中的列名,n表示取第几个字段

object_id(‘表名’) 获取表的id值
image.png
image.png
image.png

获取数据

image.png
image.png
image.png
**

报错注入

这里就讲个思路,payload都在上面union注入中
**

方法1

image.png

方法2

image.png

XP_cmdshell 连接3389

xp_cmdshell默认在mssql_2000中是开启的,在mssql_2005之后的版本中默认禁止

如果用户拥有sa权限,则可以用sp_configure重新开启它

  1. 开启 xp_cmdshell
  2. exec sp_configure 'show advanced options', 1;reconfigure;
  3. exec sp_configure 'xp_cmdshell',1;reconfigure;
  1. 关闭 xp_cmdshell
  2. exec sp_configure 'show advanced options', 1;reconfigure;
  3. exec sp_configure 'xp_cmdshell', 0;reconfigure

上面已经测试过了为sa权限,这里就直接看看靶机上有没有开启xp_cmdshell,ok!!!
image.png

直接执行命令提权
image.png

去靶机上看看有没有该用户,有的!!!
image.png

直接加入管理员,远程连接3389
image.png
image.png

实例

挖某个edu的时候,遇到的
image.png

当时就在后面加了个and 1=convert(int,db_name()),直接就报错出来了 。。。
image.png

后面就直接用sqlmap,嘿嘿
image.png