要了解Sql Server的基本注入,那么首先就要先去了解,什么是SqlServer,和MySQL有什么差别。(因为之前的注入学的都是MySQL注入,所以了解区别能更好的针对性思考注入方式)

什么是SqlServer

SqlServer根据我在网络上查到的资料,又叫做MSSql,MS是微软Microsoft的简写,因此我们就很容易理解了,SqlServer是微软开发的一款数据库管理系统,本质上和MySQL都一样,都是数据库管理系统。

SqlServer和MySQL有什么区别

1、MySQL体积小,MSSql体积大

2、MSSql只能在windows下使用,MySQL可以多平台使用。

3、MySQL是专门为web数据库设计的,特点是响应速度快。MSSql这点是不如的。

4、MSSql处理的数据量比MySQL更大。

简而言之,MSSql适用于体量不小的公司,MySQL更适用于小公司或者个体

SqlServer注入原理

SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。 一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。 在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。 由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来终止注入的字符串。 执行时,此后的文本将被忽略。

上面是微软官方给出的解释,简单来讲,就和我们注入MySQL的方式是一样的,注入恶意代码,然后去执行。

后面官方还举了个例子,是用分号结束前面的语句,然后又执行了一个语句,并用注释符号把后面的内容注释掉,就是简单的堆叠注入。

至此,我发现SqlServer的注入原理与方法和MySQL是一样的,其他的不同之处我想就在数据库的自身特点上了吧。

SqlServer基本注入

需要知道的知识:

1、MSSql的系统自带数据库:master

2、在网站中,同一个网站一般不会跨库。

3、MSSql中每一个库都有一个系统自带表:sysobjects(这是系统对象表,保存当前数据库的对象)

4、注意sysobjects中的三个字段:NAME、XTYPE、ID

NAME字段是表名信息;

XTYPE字段是表的类型(只有两个参数:S和U;S代表系统表、U代表用户创建表);

ID字段的值用来连接syscolumns表

5、syscolumns表保存当前数据库中的所有字段

6、syscolumns表我们需要查询的字段是NAME字段,Name字段保存的是字段名称

7、top关键字:由于MSSql中没有Limit函数,因此我们想要输出限制的数据就要top +数字

8、MSSql中常用参数:

@@version:查询当前数据库版本

db_name():查询当前数据库名称

user:查询当前用户

9、 IS_SRVROLEMEMBER():查询数据库权限(严格来讲这是个函数,拆分来记srv即server:服务,role:角色,member:成员)

常用权限:sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin(这些常用权限是是作为上面的函数的参数出现的)

用法如下:select IS_SRVROLEMEMBER('sysadmin');如果是该权限,则会返回1

10、cast函数,可以把查询的数据转换成字符型,这个可以用于报错注入,用法如下:

cast(count(*) as varchar(255))+char(94)

注意加号要换成url编码:%2b否则会报错

11、len()函数,MSSQL中的判断字符长度的函数

12、substring函数,截断字符串的函数

13、waitfor delay '0:0:5'命令是延时五秒的意思

14、if ascii()语句中,ascii的返回值是条件

报错注入

1、首先要用到之前说的cast函数,我们可以根据cast函数将数据转换成字符类型,这一点进行数据类型的不同进行报错注入,因为它会提醒你‘将某个值转换成类型x的时候转换失败’,我们就可以知晓数据需要的类型

2、我们可以用having 1=1爆出第一个字段名,语句如下:

and (select top 1 * from 表名 having 1=1)>1

会报错:“选择列表中的列’表名.列名1’无效,因为该列没有包含在聚合函数或GROUP BY子句中”

3、用group by 来爆出后面的字段,这是由于group by后面跟的字段数要与select查询的字段数一致

and (select top 1 * from 表名 group by 列名1)=1

会报错:“选择列表中的列’表名.列名2’无效,因为该列没有包含在聚合函数或GROUP BY子句中”

下一条语句:

and (select top 1 * from 表名 group by 列名1,列名2)=1

下面还会报上面的错,不过会是下一个字段了,一直往后直到没有上述报错为止。

布尔盲注

和MySQL的注入方式基本一致,但是函数注意是须知知识中的11、12

时间盲注

1、我们使用if ascii(substring())=x waitfor delay '0:0:5'来判断字符的值,若是前面的条件符合,则等待五秒

2、一条一条的向下寻找后面的字符

更多推荐

SqlServer基本注入