SQL injection : UNION attacks
当应用程序易受SQL注入攻击并且查询结果在应用程序的响应中返回时,可以使用UNION关键字从数据库中的其他表检索数据。这将导致SQL注入联合攻击。
UNION关键字允许您执行一个或多个附加的SELECT查询,并将结果附加到原始查询。例如:
SELECT a, b FROM table1 UNION SELECT c, d FROM table2
此SQL查询将返回一个包含两列的结果集,其中包含table_1中a列和b列以及table_2中c列和d列的值。
要使联合查询正常工作,必须满足两个关键要求:
各个查询必须返回相同数量的列。
每列中的数据类型必须在各个查询之间兼容。
要执行SQL注入联合攻击,您需要确保您的攻击满足这两个要求。这通常包括计算:
从原始查询返回多少列?
从原始查询返回的哪些列具有合适的数据类型,以保存注入查询的结果?
Determining the number of columns required in an SQL injection UNION attack 确定SQL注入联合攻击中所需的列数
在执行SQL注入联合攻击时,有两种有效的方法可以确定从原始查询返回多少列。
第一种方法涉及注入一系列ORDER BY子句并递增指定的列索引,直到出现错误。例如,假设注入点是原始查询WHERE子句中的带引号的字符串,您将提交;
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.
这一系列payloads修改原始查询,以按结果集中的不同列对结果进行排序。ORDERBY子句中的列可以由其索引指定,因此您不需要知道任何列的名称。当指定的列索引超过结果集中的实际列数时,数据库将返回错误,例如:
The ORDER BY position number 3 is out of range of the number of items in the select list.
应用程序可能在其HTTP响应中实际返回数据库错误,也可能返回一般错误,或者干脆不返回任何结果。如果可以检测到应用程序响应中的某些差异,则可以推断查询返回了多少列。
第二种方法涉及提交一系列UNION SELECT有效负载,指定不同数量的空值:
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.
如果空值的数量与列的数量不匹配,数据库将返回一个错误,例如:
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
同样,应用程序可能实际返回此错误消息,也可能只返回一般错误或无结果。当空值的数量与列的数量匹配时,数据库将在结果集中返回另一行,每列中包含空值。对结果HTTP响应的影响取决于应用程序的代码。如果幸运的话,您将在响应中看到一些额外的内容,例如HTML表上的额外一行。否则,null值可能会触发不同的错误,例如NullPointerException。
在最坏的情况下,响应可能无法与由不正确的null数引起的响应区分开来,这使得此确定列计数的方法无效。
使用NULL作为插入的SELECT查询返回的值的原因是,每列中的数据类型必须在原始查询和插入的查询之间兼容。由于NULL可转换为所有常用的数据类型,因此在列计数正确时,使用NULL可最大限度地提高有效负载成功的可能性。
在Oracle上,每个SELECT查询都必须使用FROM关键字并指定有效的表。Oracle上有一个名为dual的内置表,可用于此目的。因此,Oracle上的注入查询需要如下所示:“UNION SELECT NULL FROM DUAL–”。
所描述的有payloads使用双破折号注释序列–注释掉注入点之后原始查询的其余部分。在MySQL上,双破折号序列后面必须跟一个空格。或者,可以使用散列字符#来标识注释。
Finding columns with a useful data type in an SQL injection UNION attack在SQL注入联合攻击中查找具有有用数据类型的列
执行SQL注入联合攻击的原因是能够从注入的查询中检索结果。通常,您要检索的感兴趣的数据是字符串形式的,因此您需要在原始查询结果中找到一个或多个列,这些列的数据类型是或与字符串数据兼容。
在已经确定了所需列的数量之后,您可以通过提交一系列UNION SELECT有效负载(依次将字符串值放入每列)来探测每一列,以测试它是否可以保存字符串数据。例如,如果查询返回四列,您将提交:
' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--
如果列的数据类型与字符串数据不兼容,则插入的查询将导致数据库错误,例如:
Conversion failed when converting the varchar value 'a' to data type int.
如果没有发生错误,并且应用程序的响应包含一些附加内容(包括注入的字符串值),则相关列适合检索字符串数据。
比如:

Using an SQL injection UNION attack to retrieve interesting data 返回特殊值
确定原始查询返回的列数并找到哪些列可以保存字符串数据后,就可以检索感兴趣的数据了。
假设:
原始查询返回两列,这两列都可以保存字符串数据。
注入点是WHERE子句中带引号的字符串。
数据库包含一个名为users的表,其中包含username和password列。
在这种情况下,您可以通过提交输入来检索users表的内容:
'从用户中选择用户名、密码–
当然,执行此攻击所需的关键信息是有一个名为users的表,其中有两列名为username和password。如果没有这些信息,您将不得不猜测表和列的名称。事实上,所有现代数据库都提供了检查数据库结构的方法,以确定它包含哪些表和列。
比如:输入
' union select%20 username,password from users --++
或许就能返回出特别的东西

Retrieving multiple values within a single column 在单个列中检索多个值
在前面的示例中,假设查询只返回单个列。
通过将多个值串联在一起,可以轻松地在单个列中检索多个值,理想情况下,可以使用合适的分隔符来区分组合值。例如,在Oracle上,您可以提交输入:
' UNION SELECT username || '~' || password FROM users--
这使用了双管道序列| |,它是Oracle上的字符串连接运算符。注入的查询将用户名和密码字段的值连接在一起,用~字符分隔。
查询结果将允许您读取所有用户名和密码,例如:
…
administrator~s3cure
wiener~peter
carlos~montoya
…
请注意,不同的数据库使用不同的语法来执行字符串连接。
例如
如果:
'union select null,null --+
前面的null和后面的null数据类型不一样,就不能分别回显username和password。
如此方法:
' union select 1,username||'~'||password from users --+
就可以回显出账号密码:

SQL injection : UNION attacks的更多相关文章
- 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query
目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...
- SQL injection
SQL injection is a code injection technique, used to attack data-driven applications, in which malic ...
- Portswigger web security academy:SQL injection
Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...
- How to prevent SQL injection attacks?
In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...
- Exploiting second-order SQL injection 利用二阶注入获取数据库版本信息 SQL Injection Attacks and Defense Second Edition
w SQL Injection Attacks and Defense Second Edition Exploiting second-order SQL injection Virtually ...
- 防sql注入之参数绑定 SQL Injection Attacks and Defense
http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...
- 防sql注入之参数绑定 SQL Injection Attacks and Defense 预处理语句与存储过程
http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...
- 网络攻击技术开篇——SQL Injection
本文转自: http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库 ...
- 网络攻击技术:SQL Injection(sql注入)
网络攻击技术开篇——SQL Injection 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...
随机推荐
- shell 调用其他shell脚本中的变量、函数
在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh (两个点之间,有空格) 方法二: source ./subscript. ...
- 欧拉函数&筛法 模板
https://blog.csdn.net/Lytning/article/details/24432651 记牢通式 =x((p1-1)/p1) * ((p2-1)/p2)....((pn-1 ...
- 【故障公告】redis 服务器宕机引发博客站点故障
非常抱歉,今天下午 17:10~17:40 左右,由于博客系统所使用的 redis 服务器宕机,造成博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 我们会针对这次故障改进 redis 服务器 ...
- Linux | 管首命令符号
简介 管道的意思,在我们日常生活中,意思就是运输一个东西,到下一个地方,所以说 管道命令符 的使用也是差不多的,也是运送一段数据到下一个地方,格式:命令A | 命令B | 命令C .... 所以说,管 ...
- windows下flutter2.2.3环境搭建
先上几个必上的网站: 官网: https://flutter.cn/docs/get-started/install/windows 中文资源网(毕竟中文母语,看着轻松): https://flutt ...
- Python----MongoDB数据库
什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...
- 【Azure 环境】Azure通知中心(Notification Hub)使用百度推送平台解说
问题描述 在通知中心的页面中显示支持BaiDu,介绍一下支持的是百度(Baidu)的什么吗?Azure的这个功能在国内使用的时候是否可以保证国内安卓手机的信息送达率? 问题解答 通知中心的页面中的Ba ...
- sql 建立新表
USE [exam]GO /****** Object: Table [dbo].[tx] Script Date: 12/13/2020 22:19:59 ******/SET ANSI_NULLS ...
- 接入 SDK 结果翻车了?了解 SDK 的那些事
前段时间,二狗子的朋友圈被工信部发布的<关于下架侵害用户权益 App 名单的通报>给刷屏了.公告中指出有 90 款 App 未按照要求完成整改将会下架.而这 90 款 App 涉及全国各地 ...
- 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面
一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...