当应用程序易受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的更多相关文章

  1. 梨子带你刷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 ...

  2. SQL injection

    SQL injection is a code injection technique, used to attack data-driven applications, in which malic ...

  3. Portswigger web security academy:SQL injection

    Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...

  4. How to prevent SQL injection attacks?

    In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...

  5. 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 ...

  6. 防sql注入之参数绑定 SQL Injection Attacks and Defense

    http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...

  7. 防sql注入之参数绑定 SQL Injection Attacks and Defense 预处理语句与存储过程

    http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...

  8. 网络攻击技术开篇——SQL Injection

    本文转自: http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库 ...

  9. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

随机推荐

  1. ExtJs4学习(十)Grid单元格换色和行换色的方法

    Grid单元格换色 { text:'类别', dataIndex:'type', align:'center', renderer:function(value,metaData){ console. ...

  2. Python+unittest+excel

    接口测试设计思想: 框架结构如下: 目录如下: readme: config下的run_case_config.ini 文件说明: run_mode: 0:获取所有sheet页 1: if case_ ...

  3. 滑动窗口通用解leetcode字符串匹配问题

    滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针. 思路: 1.维护一个窗口,不断的向右边移动 2.满足要求后,移动左边,当不满足时,跳出. 3.重复1,2.得出答案. 下面 ...

  4. centos搭建dns服务器

    前言:搭建dns服务器,dns服务器我就不多说什么了,大家都懂,就是域名解析,就将ip装换为域名,域名就可以理解为类似这样的www.baidu.com网址,接下来我就直接上图了.这里面最重要的是修改u ...

  5. 安装GLPI

    Centos7安装GLPI资产管理软件 系统信息 环境说明 下面的命令可以查看系统的版本信息,本次使用的是centos7 cat /etc/redhat-release uname -a IP地址信息 ...

  6. 「CF521D」 Shop

    「CF521D」 Shop 传送门 题目说是有三种操作,首先可以知道赋值操作是可以转化为加法操作的,即 \((1,b) \rightarrow (2,b-a_i)\) 然后加法对于一个数你肯定优先选择 ...

  7. Java 并发之 Fork/Join 框架

    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名 ...

  8. POJ2044 Weather Forecast 题解

    写了一个小时--不会--无耻地看题解去了-- 关键在于存储状态的方式,真没想到-- 每个状态要存当前坐标.天数和这个状态下四个角的情况,vis数组存整张图的访问情况,有天数.坐标.四个角的情况,只有这 ...

  9. RHEL7通过Rsyslog搭建集中日志服务器

    说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建rsyslog日志服务器的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查看相 ...

  10. [考试总结]noip模拟14

    咕掉了好长时间,现在终于回来了.. 这次考试炸裂得很完蛋,直接分数上天. \(T1\) 本来想打一个记忆化搜索,然而老是通过不了样例,然后就挂了,只剩下了垃圾的 \(30pts\) 部分分数. 然而到 ...