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万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...
随机推荐
- Docker:docker部署redis
docker镜像库拉取镜像 # 下载镜像 docker pull redis:4.0 查看镜像 # 查看下载镜像 docker images 启动镜像 # 启动镜像 docker run --na ...
- Hadoop0.20.2中MapReduce读取gb2312文件出现乱码问题
单位用的是Linux系统的字符编码是gb2312,所以生成的文件都是按照默认编码生成的.给我的文件也都是gb2312的,在hadoop中运行mapreduce出现乱码,在网上查资料说是因为hadoop ...
- 使用过redis做异步队列么,你是怎么用的?有什么缺点?
Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...
- 个人博客开发之blog-api项目统一结果集api封装
前言 由于返回json api 格式接口,所以我们需要通过java bean封装一个统一数据返回格式,便于和前端约定交互, 状态码枚举ResultCode package cn.soboys.core ...
- Qt5双缓冲机制与实例
1. 双缓冲机制 所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上. 在早期的Qt版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁的现象, ...
- PYTHON 读取ADB记录文件输入ACTIVITY
import re lb=[] with open("daaa.txt",encoding="utf8") as f: data = f.readlines() ...
- JPA用法中字段起名规范
前两天在学习Springboot使用JPA 来操作数据库时,碰到一个问题,最终发现了JPA写法中表字段名称要写规范. 记录下来提醒自己. CityEntity是一个City的实体类. 1 @Table ...
- MapReduce处理简单数据
首先要说明的是,关于老师给的实验要求,我在网上看到了原文,原文地址:https://blog.csdn.net/qq_41035588/article/details/90514824,有兴趣的同学可 ...
- [刘阳Java]_easyui-panel组件入门级_第3讲
EasyUI中的panel组件在前面一节中我们简单告诉了大家代码如何写.这一节我们会从panel的入门级开始讲起走,重点包括它的事件监听,属性tool介绍 1. 事件监听-通过data-options ...
- FreeRTOS-01-任务相关函数
3 任务相关API函数 任务相关函数如下: 任务创建和删除API函数 任务创建和删除实验(动态方法) 任务创建和删除实验(静态方法) 任务挂起和恢复API函数 任务挂起和恢复实验 3.1 任务创建AP ...